1 Introduction

The military capabilities states possess are an important instrument of military power, and consequently national power (Morgenthau 1948). Yet existing work on both the causes and consequences of military power are limited in empirical identification to coarse measures like military spending or military personnel. Not all soldiers are created equal, and much has been said about the problems of measuring military power using military spending figures (Perlo-Freeman 2017) or aggregate measures like the composite index of national capabilities (CINC) (Carroll and Kenkel 2019). While military technology is one of only many components of military power (and military equipment only one dimension of military technology), its effects are significant, if hotly debated. Without denying the importance of non-technological factors like military culture, institutions and doctrine (Lieber 2005; R. Brooks and Stanley 2007), inconsistent findings about the role of technology in conflict stem not from the fact that technology does not matter, but rather it has been improperly identified and coarsely measured (van Creveld 2010; S. G. Brooks and Wohlforth 2016).

This paper seeks to contribute to ongoing research about the causes and consequences of military power by producing the first comprehensive dataset of the distribution of military capabilities across all states from 1970 – 2014. Disaggregating military power into its component parts is an important, yet underdeveloped, enterprise. While aggregate military spending may help differentiate large and globally capably militaries from smaller ones, it risks conflating differences in the of nominally equivalently sized militaries. The composition of a state’s navy may influence its threats, power projection, and warfighting capabilities in some conflicts, but not others (Caverley and Dombrowski 2020; Gartzke and Lindsay 2020), and the relationship between the military technologies a country could acquire, actually possesses, and subsequently uses in a contest could shed light on contrasting findings about the impact of military capabilities on international affairs (Douglass and Gannon 2019).

This paper proceeds as follows. Section 2 identifies the role that military technology plays as both an important cause and consequence in the study of international politics. Section 3 outlines the scope of the newly produced Distribution of Military Capabilities (rDMC) dataset. Section 4 briefly describes the data collection process. Section 5 identifies some initial trends in variation in the distribution of military capabilities across time and space and Section 6 concludes.

2 Significance

Most of the research on international conflict has focused on the beginning and end of war – its causes and consequences. However, the conduct of conflict, whether actual or latent, has much to tell us about war’s causes and consequences (Boot 2006; Biddle 2007). Regarding its causes, if, as Clausewitz noted, war is the continuation of politics with other means, then the tools used for war the other means. Military means matter, but evaluating whether they do (and if so, the degree and circumstance) is an impossible endeavor without empirical data on the distribution of those means across time and space. If it turns out that military means do matter, then Clausewitz’s point is that understanding these means fundamentally shapes our understanding of war as a political process. What a country is able to accomplish with military force in a specific situation is a function of military technology, organization, and doctrine and the manner in which these things relate with the political and geographic circumstances at hand (Betts 1997). Regarding war’s consequences, the military capabilities available to actors play a role in determining whether bloodshed is preferable to resolving the dispute through a negotiated settlement (Slantchev 2003b).

The innovation, acquisition, and organization of military technology is an important determinant of national military force since it comprises the tools available for the resolution of international disputes. The combination of capabilities that comprise a military’s toolkit determine the operations it undertakes, the types of threats it can credibly make, and the consequences of resorting to force (Buzan 1987). In other cases, military technology has had contrasting consequences in the same conflict despite prior expectations of consistency. During the 1879 Anglo-Zulu War, the United Kingdom expected their firearms – and the lack of any Zulu contact with firearms – to provide a significant tactical advantage (Guy 1971). However, the United Kingdom suffered a serious loss at Isandlwana despite being armed with the Martini-Henry rifle (Beckett 2013). After this resounding defeat, the British shifted their technological strategy by deploying the recently invented Gatling gun which allowed the much smaller British army to overwhelm the Zulu tribes in a matter of minutes Willbanks (2004, 33). Two cases of technological superiority were associated with contrasting outcomes, pointing to the importance of identifying different types of technology in warfare rather than just the presence of innovation.

The wide body of literature studying war has recognized the degree to which these concerns are shaped by states fight. If scholars understand the process by which states make choices about what military capabilities they possess, they can better understand how different aspects of those capabilities impact outcomes of interest (Caforio 2006). The tools that comprise national military force influence war’s participants (Fordham 2004; Beckley 2017), victors (Rosen 1991; Lyall and Wilson 2009; Cappella Zielinski and Grauer 2020), costs (Caverley 2014; Talmadge 2019), location (Schilde 2017; Crisher 2017), and duration (Martinez Machain 2015; Cappella Zielinski 2016b; Caverley and Sechser 2017) as well as power projection (Corbett 1911; Beasley 2015), what issues are resolved with force (Allison and Morris 1975; Becker 2017), what threats are credible (Buzan and Herring 1998; Slantchev 2003a; Post 2019; Montgomery 2020), reputation (Erickson 2018), and the balance of power (Glaser 1992; Horowitz 2010; Gartzke, Kaplow, and Mehta 2014).

The portfolio of military capabilities also informs broader questions outside the traditional scope of international security like when coups succeed (Talmadge 2016; Caverley and Sechser 2017) and civil-military relations (Forster 2005; R. Brooks 2008; Kadercan 2014). In the early 1972, the head of the Bangladeshi government successfully held off a coup by creating a special security force (the Jatio Rakkhi Bahini) of loyal forces. Two years later, however, Bangladesh purchased 30 T-54 tanks from Pakistan which allowed the army to overtake the special security forces in a storm of the president’s residence, resulting in his death and an overthrow of the secular government (Maniruzzaman 1992, 745–47).

The study of domestic politics has also recognized the importance of military capabilities. Tension between political budget constraints and military security desires gets to the heart of the role that military capabilities play in furthering our understanding of national politics (Fordham 2004; Cappella Zielinski 2016a; Gholz and Sapolsky 2020). Other domestic issues like inter-branch relations (Jones and Marsh 2011), public opinion (E. N. Saunders 2015), and interest group lobbying (Holland 1993; Dombrowski and Gholz 2006; Gholz 2011) all point to the importance of a better understanding of the drivers of a state’s military portfolio.

Despite the shortcomings of aggregate measures for explaining concepts of interest, most current research still focuses on variation in the of state militaries (Aufrant 1999; Fordham 2002; Sample, Valeriano, and Kang 2013; Cappella Zielinski, Fordham, and Schilde 2017; Odehnal and Neubauer 2020). Recent work that disaggregates military technology has investigated the relationship between important conflict outcomes and capabilities like naval platforms (Crisher and Souva 2014), mechanized armies (Lyall and Wilson 2009; Sechser and Saunders 2010), and air power (Martinez Machain 2015; Allen and Martinez Machain 2017, 2018; R. Saunders and Souva 2020). Despite these data being limited in scope, this existing research highlighted the value of disaggregating military power for understanding the international balance of power.

National militaries are primarily quantified and compared by military spending levels or, in rarer cases, military personnel counts. Yet data on military spending poses known problems as a metric for cross-national and temporal comparison (Perlo-Freeman 2017). Since there are no common definitions about what constitutes military spending, some states measure things like pension and R&D while others do not (Amara and Paskevics 2010). Exchange rates are often used to standardize all spending to the same currency, but with ill-information applications of domestic purchasing power (Fontanel 1996). Factors like inflation and varying budget cycles are also difficult to account for and dramatically impact inferences drawn from different data sources (Lebovic 1999). Sources like the IMF, the UN Office for Disarmament Affairs, the US Bureau of Arms Control, Verification, and Compliance, the International Institute for Strategic Studies (IISS), and the Stockholm International Peace Research Institute (SIPRI) all produce annual military spending estimates but they use different estimating procedures, primary sources, and preparation methods (Brzoska 1981), meaning theories supported using one data source will often not be supported using comparable data from another source (Boniface 1995).

Military spending data also has a temporal bias, with earlier time periods experiencing higher uncertainty. This has been extensively documented in the case of West Germany military spending during the Cold War, where later research found that West Germany’s internal figures differed from what they were reporting to NATO (Brzoska 1981; Cowen and Karp 1986). Even commonly used sources like SIPRI caution researchers on using their military spending data for cross-national comparisons, arguing that it is instead only appropriate to compare any one country over time (Omitoogun and Skons 2006). Furthermore, military spending measures don’t account for what states spend that money on and how variations in factors like geography complicate our ability to compare the production of security across states. While these problems likely exist with military equipment data as well, scholars have not even been able to identify the degree or direction of this bias because the data does not yet exist.

Measurement issues aside, although scholars and practitioners know that defense spending varies across space and time, a second dimension of important and understudies variation is that militaries also vary in their .2 Scholars have noted ``there is a lack of knowledge about variation between states in their behavior on armaments policy decisions" (Mawdsley 2018) because of problems empirically identifying the military capabilities states possess (Fordham 2004). But in order to identify the drivers of armament decisions, scholars must know what armament decisions have been made (Kurth 1973). Understanding differences in the composition of military capabilities is vital to understanding military power because these components are not homogeneous. These capabilities differ in what they can accomplish (Lindsay and Gartzke 2020) and the fact there are differences in how even similarly-sized states arm themselves is prima facie evidence of the non-fungibility of material military power. Military spending itself does not create military power; rather, that money must be translated into capabilities that allow for the exercise of power through a variety of distinct means.

Although scholars of international conflict have paid comparatively little attention to identifying the distribution of military capabilities, the same is hardly true for practitioners. During the Cold War, British diplomat James Cable (1970, 127) described the US as “the only navy with the sheer number of ships, with enough aircraft carriers, ocean-going surface warships, amphibious craft and supply vessels, to undertake every class of operation, in any part of the oceans and for as much of the future as can yet be foreseen.” This is the political dimension of force structure decisions – what a states produces and omits in its defense portfolio reflects its political priorities in ways that economic considerations alone cannot explain (Hone 1993; Caverley 2007). As then-Senator Joseph Biden (2008) remarked regarding domestic economic policy during his vice presidential campaign, “[d]on’t tell me what you value. Show me your budget, and I’ll tell you what you value.” This also holds true in the military context, where disconnects concerning a state’s budget and alleged priorities are missed by looking at top-line spending figures. Despite decades of concern about a Chinese invasion of Taiwan, it was not until 2017 that China began investing in the amphibious assault capabilities that are necessary for that threat to actually be carried out (Office of the Secretary of Defense 2018, 95–99).

3 The rDMC Dataset: Scope and Data Generating Process

This paper introduces the first comprehensive dataset of disaggregated military capabilities. Data on military technology portfolios is produced by the International Institute for Strategic Studies (IISS) in the annual Military Balance reports. Different portions of these reports have been used frequently in academic publications. Most of this work has used IISS data on military spending (Goldstein 1998; Wohlforth 1999; Hallerberg and Marier 2004; Greenhill and Major 2007) or personnel (Lieber and Alexander 2005; Sundstrom 2005; Walter 2006; Stanton 2013; Gaibulloev et al. 2015). The little work that has looked at IISS data on the distribution of military capabilities has focused on a narrow list of platforms like mechanized vehicles (Lyall and Wilson 2009; Sechser and Saunders 2010), strategic lift aircraft (Kupchan 1988), and fighter jets (R. Saunders and Souva 2020) or a short list of countries like great powers (S. G. Brooks and Wohlforth 2016) or China and its rivals (Beckley 2017). The primary reason for this relatively limited use of fine-grained high-quality data is difficulty in converting the data to an easily-usable format and standardizing it across countries and years.

The data represent military capabilities for 182 countries over almost half a century (1970 – 2014). Although the Military Balance was first published in 1961, prior to 1970 the report focused on NATO and Warsaw Pact states only, with more information provided about the former than the latter (Nelson 1985; Böhmelt and Pilster 2015). Using 1970 as the cut off, Figure shows what percent of years are coded for each country.3 54% of countries have no missing data across the entire time span, with the median country having data available for 95% of its years and the mean country having 88% coverage.

Coverage of available data on state military capabilities (1970 -- 2014)

Figure 3.1: Coverage of available data on state military capabilities (1970 – 2014)

The military capabilities are organized hierarchically, with higher levels of organization representing broad categories like helicopters or principal surface combatants and lower levels of organization representing distinct roles within those categories like attack helicopters versus transport helicopters or aircraft carriers versus destroyers. The rDMC codebook accompanying this paper and dataset describes the temporal and spatial scope of the data as well as the military capabilities that are included.

As with much data in international affairs, concerns about data quality and accuracy remain salient. The extensive use of the IISS Military Balance reports by other scholars gives some confidence in its accuracy and also allows for the data codings here to be double-checked with data codings by other scholars to correct data entry and coding errors. An extensive, but not exhaustive list of those publications is provided in the appendix. A list of the most comprehensive uses of IISS military capabilities data is provided in Table .

Policymakers similarly rely on the IISS Military Balance reports, with former US Army General Petraeus describing it as “the go-to source of unclassified, independent information on defense capabilities around the world,” former US Secretary of Defense Robert Gates noting that it “provides essential facts and analysis for decision-makers and for better informed public debate,” and former US Secretary of Defense Leon Panetta remarking that it is “widely recognised as the best unclassified source of defense information on personnel, equipment and budgets for every country.” Even if the data does not perfectly represent state military capacities, it influences how policymakers behave since they use the data for their analysis. The former Supreme Allied Commander of NATO, Admiral James Stavridis, said ``throughout my career, I have relied extensively on The Military Balance produced so expertly by the IISS. It is the “go to” source for serious analysts and warriors facing real world challenges."4

The accuracy of the data can also be double checked in certain instances using reliable primary source data from government reports. New Zealand, for example, publishes annual reports on the military’s performance targets that describe the resources at the military’s disposal (Alexander, King, and Robert 2002). Although such data is not available for all countries nor for all years, checking the data in such a manner where possible should provide face validity about the accuracy of the IISS measures.

4 Data Collection and Formats

The data collection process first involved creating a consistent typology of military equipment types, equipment names, and unit names. I create two versions of the data. The first, , organizes military equipment true to the original IISS categorizations. The second and third, and produce a new more aggregated classification of military capabilities. Table shows the unique values that exist at each nested level in the categorization scheme provided by IISS, how that can be aggregated using IISS categories, and then how that is further aggregated in the final classification. A detailed description of the different data versions follows.

4.1 rDMC raw

IISS categorizes military capabilities according to the following levels, in order of increased specificity: equipment types, equipment subtypes, equipment names, equipment subnames, and unit names.5 Equipment type involves the most aggregate categorizations like aircraft or armored fighting vehicles. Subtype and subname are auxiliary classifications that exist for some, but not all technologies, like designations of light, medium, and heavy variations of transport aircraft or distinguishing difference classes of aircraft carriers. Equipment names are the next primary IISS categorization and produce information about classifications like transport or fighter aircraft or main battle tanks as a variety of armored fighting vehicles. Then at the unit level one can identify, for example, the number of M1A1 Abrahms main battle tanks each country possessed.

The main utility of the categorization is in providing an objective and unaltered version of the original IISS data, true to their data generating process. No coding decisions, new equipment categorizations, or ontologies inform this version of the data. Furthermore, this version of the data is unique in providing unit-level information. This level of disaggregation has potential use for studies examining questions like combat effectiveness, arms sales, or interest group lobbying.6

For example, scholars have identified the challenges of observable proxies for ex-ante military effectiveness (R. Brooks and Stanley 2007; Millett and Murray 2010a, 2010b, 2010c). Biddle (2005, 135) uses the age of military technology as a proxy for its effectiveness. During Operation Desert Storm, the average date of introduction for US weapons was 1974 while Iraq’s was 1962. But until now, broader measures of the age of different components of a state’s military portfolio have remained unexamined. Scholars interested in dependent variables like military effectiveness could use this information to differentiate the predicted battlefield performance of a state with 100 M1A2 SEPv2 Abrams main battle tanks (in service since 2013) with a state with 100 T-55 main battle tanks (in service since 1949). As an example, Figure shows a broader comparison of the age of introduction for each main battle tank in the data as well as its last recorded year in service. The year of introduction is identified as the first year in which at least one state possessed that type of tank.7 Since data also exists about the origins and national producers of various military units, research on arms sales would benefit from being to more thoroughly identify patterns in reliance (Caverley et al. 2013; Erickson 2018).

The first year in which each type of main battle tank was deployed by any state. The figure is organized chronologically, with the newest main battle tanks at the top.

Figure 4.1: The first year in which each type of main battle tank was deployed by any state. The figure is organized chronologically, with the newest main battle tanks at the top.

4.2 rDMC long and rDMC wide

From this, the technology categories are aggregated to a new typology representing variety in military technologies of interest to scholars who have less of a need for granular information differentiating M1A1 Abrahms tanks from M1A2 Abrahms tanks and are instead interest in the number of armored combat vehicles a state possesses. I first aggregated the technologies to unique triples composed of equipment type, subtype, and name using the IISS categorizations. This typology is consistent across country and year, thus simplifying the process of time series-cross sectional analysis. Where inconsistencies arise, coding decisions were made with reference to external sources and transparently coded in the data available online. This ensure that, for example, the C-130H Hercules is always listed with an equipment type coding of ‘aircraft’ and an equipment name coding of `transport (TPT)’.8 This results in a count for “aircraft – transport” for every country with a value that is the sum of all units that country possessed that had the equipment type, subtype, name, subname, and unit name corresponding to that higher level aggregation.

and are identical in terms of content and differ only in the unit of analysis. In , the unit of analysis is the country-year-technology, so the only variable for each row is the numeric count corresponding to the unique identifier. In , the unit of analysis is the country-year with each unique technology value becoming its own column. Although both versions are substantively identical, both are provided as reshaped versions of each other to simplify the process of subsetting and merging with other datasets. Given their interchangeability, in the section that follows, either version can be used to produce substantively identical figures and summary statistics.

The 66 categories that comprise the technologies are shown in Figure . Empirically, this aggregation is helpful because the technology categories are definitionally uniform across the data sample. Theoretically, these categories were chosen because they represent weapons categories commonly recognized and used by states in arms reduction agreements like the Treaty on Conventional Armed Forces in Europe (CFE). As a result, national records are most consistent and accurate at this level of analysis since those records were used during international negotiations.

Computationally, aggregating the technology categories also reduces the sparseness of a data set that is already zero-inflated. While most country-years possess armored fighting vehicles, not all possess every kind of armored fighting vehicle (main battle tanks, armored personnel carriers, armored infantry fighting vehicles, and reconnaissance vehicles) let alone each of the

distinct units categorized as “armored fighting vehicles.” That is not to say that every type or model is the same; if it was then 6,000+ United States armored personnel carriers would not be split across 5 different models. But those distinctions present computational challenges given that even the militarily-capable United States possesses only a small fraction of all the different kinds of armored personnel carriers that exist. As a result, country-specific units would inflate inferences about between-country variation in military portfolios. Scholars interested in making those sorts of distinctions are advised to use the version of the data.

Description of the aggregated technologies used to compute the distribution of military capabilities.

Figure 4.2: Description of the aggregated technologies used to compute the distribution of military capabilities.

There are, of course, many ways to categorize technologies. Some categories could be grouped together depending on the research interest. “Aircraft – transport” and “helicopters – transport” could be considered somewhat interchangeable to those interested in a state’s ability to move personnel and material via the air. Alternatively, “helicopters – transport” could be grouped with “helicopters – search and rescue” if studying a topic like arms sales or military base location given similarity in their physical make-up. Some categories could also be further disaggregated. The category “aircraft – maritime patrol,” for example, include anti-submarine warfare, anti-surface warfare, and maritime reconnaissance which all “patrol” different areas of the sea. Aside from these deductive ways of aggregating or disaggregating the military technologies, inductive methods could identify different sets of similar technologies based on things like rarity, pairwise occurrence, or component parts (Douglass and Gannon 2019). Rather than try to create and justify a single definitive ontology of military technologies, the data are constructed so that all aggregations are transparent and, more importantly, modular. By simply selecting new aggregation categories, scholars can produce their own counts with different categories. Scholars who wish to differentiate between those categories can transparently see how those were aggregated, change those aggregations (including creating new technology categories or deleting existing ones), and produce a new dataset consistent with the classifications that suite their research questions.

6 Conclusion

Heterogeneity in how states arm themselves exists and is significant both in terms of substance and consequence. Identifying the dimensions of this heterogeneity is a necessary precondition for explaining both its causes and consequences in international affairs. To date, explanations of the causes or effects of variation in the composition of a state’s military assets has been empirically limited because that data has not existed in a way conducive to systemic analysis. This is not just true for quantitative scholars interested in large cross-national regressions; scholars studying individual countries, regions, or specific time periods have been limited in their ability to provide even descriptive accounts about the balance of military power using any observations more detailed than national military spending, military personnel counts, or outcomes of interests like actualized conflicts. The hope is that the broader scholarly community can use the data created here to answers other questions of interest. While much ink has been spilled debating military technology matters (Tuchman 1962; Rosen 1991; Betts 1997), the discussion should productively shift to military technologies matter and . In transparently presenting the process by which this data was created, that should be easier.

7 References

Adamsky, Dima. 2010. The Culture of Military Innovation: The Impact of Cultural Factors on the Revolution in Military Affairs in Russia, the US, and Israel. Stanford University Press.
Alexander, J., Alan B. King, and W. Robert. 2002. “Country Survey XVII: New Zealand’s Defence Policy.” Defence and Peace Economics 13 (4): 287–309. https://doi.org/10.1080/10242690212355.
Allen, Susan Hannah, and Carla Martinez Machain. 2017. “Understanding the Impact of Air Power.” Conflict Management and Peace Science 36 (5): 545–58. https://doi.org/10.1177/0738894216682485.
———. 2018. “Choosing Air Strikes.” Journal of Global Security Studies 3 (2): 150–62. https://doi.org/10.1093/jogss/ogy005.
Allison, Graham T., and Frederic A. Morris. 1975. “Armaments and Arms Control: Exploring the Determinants of Military Weapons.” Daedalus 104 (3): 99–129.
Amara, Jomana, and Martins Paskevics. 2010. “Unfulfilled Promises: The Impact of Accession on Military Expenditure Trends for New NATO Members.” Comparative Strategy 29 (5): 432–49. https://doi.org/10.1080/01495933.2010.520988.
Aufrant, Marc. 1999. “France and Its Allies: A Comparative Study of Defence Spending Trends Since 1985.” Defence and Peace Economics 10 (1): 79–102. https://doi.org/10.1080/10430719908404917.
Avant, Deborah Denise. 1994. Political Institutions and Military Change: Lessons from Peripheral Wars. Cornell University Press.
Beasley, William M. 2015. “Closing the Presence GAP.” Proceedings 141 (11): 52–58.
Becker, Jordan. 2017. “Clearing the Air on Transatlantic Burden-Sharing, Part 2: You Gotta Give (Inputs) to Get (Outputs).” War on the Rocks. https://warontherocks.com/2017/05/clearing-the-air-on-transatlantic-burden-sharing-part-2-you-gotta-give-inputs-to-get-outputs/.
Beckett, Ian F. W. 2013. “Retrospective Icon: The Martini-Henry.” In A Cultural History of Firearms in the Age of Empire, edited by Karen Jones and Giacomo Macola, 1st ed., 233–50. London: Routledge.
Beckley, Michael. 2017. “The Emerging Military Balance in East Asia: How China’s Neighbors Can Check Chinese Naval Expansion.” International Security 42 (2): 78–119. https://doi.org/10.1162/ISEC_a_00294.
Betts, Richard K. 1997. “Should Strategic Studies Survive?” World Politics 50 (1): 7–33. https://doi.org/10.1017/S0043887100014702.
Biddle, Stephen. 2005. Military Power: Explaining Victory and Defeat in Modern Battle. Manas Publications.
———. 2007. “Strategy in War.” PS: Political Science & Politics 40 (3): 461–66. https://doi.org/10.1017/S1049096507070941.
Biden, Joseph. 2008. “Biden’s Remarks on McCain’s Policies.” The New York Times, September.
Bolving, Klaus. 2000. “The Adapted Treaty on Conventional Armed Forces in Europe - CFE - Considerations Concerning Baltic CFE-Membership.” Baltic Defence Review 4 (2000): 31–66.
Boniface, Pascal. 1995. L’année Stratégique 1995. Les équilibres Militaire. Paris: Dunod for the Institut des Relations Internationales et Strategiques.
Boot, Max. 2006. War Made New: Weapons, Warriors, and the Making of the Modern World. Penguin.
Böhmelt, Tobias, and Ulrich Pilster. 2015. “The Impact of Institutional Coup-Proofing on Coup Attempts and Coup Outcomes.” International Interactions 41 (1): 158–82. https://doi.org/10.1080/03050629.2014.906411.
Brooks, Risa. 2008. Shaping Strategy: The Civil-Military Politics of Strategic Assessment. Princeton University Press.
Brooks, Risa, and Elizabeth Stanley, eds. 2007. Creating Military Power: The Sources of Military Effectiveness. Stanford University Press.
Brooks, Stephen G., and William C. Wohlforth. 2016. “The Rise and Fall of the Great Powers in the Twenty-First Century: China’s Rise and the Fate of America’s Global Position.” International Security 40 (3): 7–53. https://doi.org/10.1162/ISEC_a_00225.
Brzoska, Michael. 1981. “The Reporting of Military Expenditures.” Journal of Peace Research 18 (3): 261–75.
Buzan, Barry. 1987. An Introduction to Strategic Studies: Military Technology and International Relations. Springer.
Buzan, Barry, and Eric Herring. 1998. The Arms Dynamic in World Politics. Lynne Rienner Publishers.
Cable, James. 1970. Gunboat Diplomacy: Political Application. New York, NY: Praeger.
Caforio, Giuseppe. 2006. “Introduction: The Interdisciplinary and Cross-National Character of Social Studies on the Military - the Need for Such an Approach.” In Social Sciences and the Military: An Interdisciplinary Overview, edited by Giuseppe Caforio, 1–20. Abingdon: Routledge.
Cappella Zielinski, Rosella. 2016a. How States Pay for Wars. Cornell University Press.
———. 2016b. “Political Economy of National Security.” Edited by Patrick James. Oxford Bibliographies in International Relations. New York, NY: Oxford University Press. https://doi.org/10.1093/obo/9780199743292-0184.
Cappella Zielinski, Rosella, Benjamin O. Fordham, and Kaija E. Schilde. 2017. “What Goes up, Must Come down? The Asymmetric Effects of Economic Growth and International Threat on Military Spending.” Journal of Peace Research 54 (6): 791–805. https://doi.org/10.1177/0022343317715301.
Cappella Zielinski, Rosella, and Ryan Grauer. 2020. “Organizing for Performance: Coalition Effectiveness on the Battlefield.” European Journal of International Relations 26 (4): 953–78. https://doi.org/10.1177/1354066120903369.
Carroll, Robert J., and Brenton Kenkel. 2019. “Prediction, Proxies, and Power.” American Journal of Political Science 63 (3): 577–93. https://doi.org/10.1111/ajps.12442.
Caverley, Jonathan D. 2007. “United States Hegemony and the New Economics of Defense.” Security Studies 16 (4): 598–614. https://doi.org/10.1080/09636410701740825.
———. 2009. “The Myth of Military Myopia: Democracy, Small Wars, and Vietnam.” International Security 34 (3): 119–57.
———. 2014. Democratic Militarism: Voting, Wealth, and War. Cambridge University Press.
Caverley, Jonathan D., and Peter Dombrowski. 2020. “Too Important to Be Left to the Admirals: The Need to Study Maritime Great-Power Competition.” Security Studies 29 (4): 579–600. https://doi.org/10.1080/09636412.2020.1811448.
Caverley, Jonathan D., Ethan B. Kapstein, J. Thomas Moriarty, Daniel Katz, and Lawrence J. Korb. 2013. “Outgunned? A Debate Over the Shifting Global Arms Market.” Foreign Affairs 92 (2): 177–82.
Caverley, Jonathan D., and Todd S. Sechser. 2017. “Military Technology and the Duration of Civil Conflict.” International Studies Quarterly 61 (3): 704–20. https://doi.org/10.1093/isq/sqx023.
Cheung, Tai Ming. 2016. “Innovation in China’s Defense Technology Base: Foreign Technology and Military Capabilities.” Journal of Strategic Studies 39 (5-6): 728–61. https://doi.org/10.1080/01402390.2016.1208612.
———. 2021. “A Conceptual Framework of Defence Innovation.” Journal of Strategic Studies 0 (0): 1–27. https://doi.org/10.1080/01402390.2021.1939689.
Corbett, Julian. 1911. Some Principles of Maritime Strategy. Longmans, Green and Co.
Cowen, Regina H. E., and Regina Cowen Karp. 1986. Defense Procurement In The Federal Republic Of Germany: Politics And Organization. Avalon Publishing.
Crisher, Brian. 2017. “Naval Power, Endogeneity, and Long-Distance Disputes.” Research and Politics 4 (1): 1–6.
Crisher, Brian, and Mark Souva. 2014. “Power at Sea: A Naval Power Dataset, 1865-2011.” International Interactions 40 (4): 602–29. https://doi.org/10.1080/03050629.2014.918039.
Delgado, Mercedes, Michael E. Porter, and Scott Stern. 2016. “Defining Clusters of Related Industries.” Journal of Economic Geography 16 (1): 1–38. https://doi.org/10.1093/jeg/lbv017.
Dombrowski, Peter J., and Eugene Gholz. 2006. Buying Military Transformation: Technological Innovation and the Defense Industry. Columbia University Press.
Douglass, Rex W., and J Andrés Gannon. 2019. “Churning Butter into Guns: Identifying Latent Military Capacity.” Working {{Paper}}.
Erickson, Jennifer. 2018. Dangerous Trade: Arms Exports, Human Rights, and International Reputation. Columbia University Press.
Eyre, Dana P., and Mark C. Suchman. 1996. “Status, Norms and the Proliferation of Conventional Weapons: An Institutional Theory Approach.” In The Culture of National Security: Norms and Identity in World Politics, edited by Peter J. Katzenstein, 79–113. New York, NY: Columbia University Press.
Fairbanks, Charles H. 1988. “Choosing Among Technologies in the Anglo-German Naval Arms Competition, 1898-1915.” In Naval History: The Seventh Symposium of the U.S. Naval Academy, edited by William B. Cogar, First Edition edition, 132–38. Wilmington, Del: Rowman & Littlefield Publishers.
Fontanel, Jacques. 1996. “The Comparison of Military Budgets of the Eastern and Central European Countries.” Defence and Peace Economics 7 (2): 135–47. https://doi.org/10.1080/10430719608404847.
Fordham, Benjamin O. 2002. “Domestic Politics, International Pressure, and the Allocation of American Cold War Military Spending.” The Journal of Politics 64 (1): 63–88. https://doi.org/10.1111/1468-2508.00118.
———. 2004. “A Very Sharp Sword: The Influence of Military Capabilities on American Decisions to Use Force.” Journal of Conflict Resolution 48 (5): 632–56. https://doi.org/10.1177/0022002704267935.
Forster, A. 2005. Armed Forces and Society in Europe. Springer.
Gaibulloev, Khusrav, Justin George, Todd Sandler, and Hirofumi Shimizu. 2015. “Personnel Contributions to UN and Non-UN Peacekeeping Missions: A Public Goods Approach.” Journal of Peace Research 52 (6): 727–42. https://doi.org/10.1177/0022343315579245.
Gartzke, Erik A., Jeffrey M. Kaplow, and Rupal N. Mehta. 2014. “The Determinants of Nuclear Force Structure.” Journal of Conflict Resolution 58 (3): 481–508. https://doi.org/10.1177/0022002713509054.
Gartzke, Erik A., and Jon R. Lindsay. 2020. “The Influence of Sea Power on Politics: Domain- and Platform-Specific Attributes of Material Capabilities.” Security Studies 29 (4): 601–36. https://doi.org/10.1080/09636412.2020.1811450.
Gholz, Eugene. 2011. “How Military Innovation Works and the Role of Industry.” {{SSRN Scholarly Paper}} ID 1901857. Rochester, NY: Social Science Research Network.
Gholz, Eugene, and Harvey M. Sapolsky. 2020. “The Many Lines of Defense: The Political Economy of US Defense Acquisition.” Journal of Global Security Studies. https://doi.org/10.1093/jogss/ogaa007.
Gilli, Andrea, and Mauro Gilli. 2014. “The Spread of Military Innovations: Adoption Capacity Theory, Tactical Incentives, and the Case of Suicide Terrorism.” Security Studies 23 (3): 513–47. https://doi.org/10.1080/09636412.2014.935233.
Glaser, Charles L. 1992. “Political Consequences of Military Strategy: Expanding and Refining the Spiral and Deterrence Models.” World Politics 44 (4): 497–538. https://doi.org/10.2307/2010486.
Gleditsch, Nils Petter, Peter Wallensteen, Mikael Eriksson, Margareta Sollenberg, and Håvard Strand. 2002. “Armed Conflict 1946-2001: A New Dataset.” Journal of Peace Research 39 (5): 615–37. https://doi.org/10.1177/0022343302039005007.
Goldstein, Avery. 1998. “Great Expectations: Interpreting China’s Arrival.” International Security 22 (3): 36–73. https://doi.org/10.1162/isec.22.3.36.
Greenhill, Kelly M., and Solomon Major. 2007. “The Perils of Profiling: Civil War Spoilers and the Collapse of Intrastate Peace Accords.” International Security 31 (3): 7–40. https://doi.org/10.1162/isec.2007.31.3.7.
Guy, J. J. 1971. “A Note on Firearms in the Zulu Kingdom with Special Reference to the Anglo-Zulu War, 1879.” The Journal of African History 12 (4): 557–70. https://doi.org/10.1017/S0021853700011154.
Hafner-Burton, Emilie M., and Alexander H. Montgomery. 2009. “Globalization and the Social Power Politics of International Economic Networks.” In Networked Politics: Agency, Power, and Governance, edited by Miles Kahler, 23–42. Cornell University Press.
Hallerberg, Mark, and Patrik Marier. 2004. “Executive Authority, the Personal Vote, and Budget Discipline in Latin American and Caribbean Countries.” American Journal of Political Science 48 (3): 571–87. https://doi.org/10.1111/j.0092-5853.2004.00088.x.
Harkness, Kristen A., and Michael Hunzeker. 2015. “Military Maladaptation: Counterinsurgency and the Politics of Failure.” Journal of Strategic Studies 38 (6): 777–800. https://doi.org/10.1080/01402390.2014.960078.
Holland, Lauren. 1993. “Explaining Weapons Procurement: Matching Operational Performance and National Security Needs.” Armed Forces & Society 19 (3): 353–76. https://doi.org/10.1177/0095327X9301900304.
Hone, Thomas C. 1993. “Force Planning Cycles: The Modern Navy as an Illustrative Case of a Frustrating Trend.” Defense Analysis 9 (1): 31–42. https://doi.org/10.1080/07430179308405566.
Horowitz, Michael C. 2010. The Diffusion of Military Power: Causes and Consequences for International Politics. Princeton University Press.
Jones, Christopher M., and Kevin P. Marsh. 2011. “The Politics of Weapons Procurement: Why Some Programs Survive and Others Die.” Defense & Security Analysis 27 (4): 359–73. https://doi.org/10.1080/14751798.2011.632251.
Jurski, Robert. 2005. “The Conventional Arms Forces in Europe Treaty and Its Contribution to Euro-Atlantic Security After 1990.” Thesis, Monterey, CA: Naval Postgraduate School.
Kadercan, Burak. 2014. “Strong Armies, Slow Adaptation: Civil-Military Relations and the Diffusion of Military Power.” International Security 38 (3): 117–52. https://doi.org/10.1162/ISEC_a_00146.
Kahn, Lauren, and Michael C. Horowitz. 2021. “Who Gets Smart: Explaining How Precision Bombs Proliferate.” {{SSRN Scholarly Paper}} ID 3792071. Rochester, NY: Social Science Research Network. https://doi.org/10.2139/ssrn.3792071.
Kali, Raja, Javier Reyes, Joshua McGee, and Stuart Shirrell. 2013. “Growth Networks.” Journal of Development Economics 101 (March): 216–27. https://doi.org/10.1016/j.jdeveco.2012.11.004.
Kier, Elizabeth. 1997. Imagining War: French and British Military Doctrine Between the Wars. Princeton University Press.
Krepinevich, Andrew F. 1986. The Army and Vietnam. Johns Hopkins University Press.
Kupchan, Charles. 1988. NATO and the Persian Gulf: Examining Intra-Alliance Behavior.” International Organization 42 (2): 317–46.
Kurth, James R. 1973. “Why We Buy the Weapons We Do.” Foreign Policy 0 (11): 33–56. https://doi.org/10.2307/1148035.
Layton, Edwin T., Roger Pineau, and John Costello. 1985. "And I Was There": Pearl Harbor and Midway–Breaking the Secrets. New York, NY: William Morrow.
Lebovic, James. 1999. “Using Military Spending Data: The Complexity of Simple Inference.” Journal of Peace Research 36 (6): 681–97.
Li, Peter M. 2010. “Relational Similarity: An Introduction and an Application to Military Alliances.” The Economics of Peace and Security Journal 5 (1). https://doi.org/10.15355/epsj.5.1.12.
Lieber, Keir A. 2005. War and the Engineers: The Primacy of Politics Over Technology. Cornell University Press.
Lieber, Keir A., and Gerard Alexander. 2005. “Waiting for Balancing: Why the World Is Not Pushing Back.” International Security 30 (1): 109–39. https://doi.org/10.1162/0162288054894580.
Lindsay, Jon R., and Erik A. Gartzke. 2020. “Politics by Many Other Means: The Comparative Strategic Advantages of Operational Domains.” Journal of Strategic Studies 0 (0): 1–34. https://doi.org/10.1080/01402390.2020.1768372.
Lyall, Jason, and Isaiah Wilson. 2009. “Rage Against the Machines: Explaining Outcomes in Counterinsurgency Wars.” International Organization 63 (1): 67–106. https://doi.org/10.1017/S0020818309090031.
Maniruzzaman, Talukder. 1992. “Arms Transfers, Military Coups, and Military Rule in Developing States.” The Journal of Conflict Resolution 36 (4): 733–55.
Martinez Machain, Carla. 2015. “Air Campaign Duration and the Interaction of Air and Ground Forces.” International Interactions 41 (3): 539–64. https://doi.org/10.1080/03050629.2015.1018414.
Mawdsley, Jocelyn. 2018. “Armaments Decision-Making: Are European States Really Different?” Comparative Strategy 37 (4): 260–71. https://doi.org/10.1080/01495933.2018.1497319.
McCausland, Jeffrey D. 2012. “European/Eurasian Security and the Treaty on Conventional Armed Forces in Europe.” Strategic Studies Institute, US Army War College.
Millett, Allan R., and Williamson Murray, eds. 2010a. Military Effectiveness: Volume 1, The First World War. 2 edition. Vol. 1. Cambridge ; New York: Cambridge University Press.
———, eds. 2010b. Military Effectiveness: Volume 2, The Interwar Period. Vol. 2. Cambridge University Press.
———, eds. 2010c. Military Effectiveness: Volume 3, The Second World War. Vol. 3. Cambridge University Press.
Montgomery, Evan Braden. 2020. “Signals of Strength: Capability Demonstrations and Perceptions of Military Power.” Journal of Strategic Studies 43 (2): 309–30. https://doi.org/10.1080/01402390.2019.1626724.
Morgenthau, Hans. 1948. Politics Among Nations. 7th edition. Boston: McGraw-Hill Education.
Murray, Williamson. 2009. “Military Adaptation in War.” {{ISA Paper}} P-4452. Institute for Defense Analyses.
Nagl, John. 2005. Learning to Eat Soup with a Knife: Counterinsurgency Lessons from Malaya and Vietnam. University of Chicago Press.
Nelson, Daniel N. 1985. “Empirical Estimates of ’Reliability’ in the Warsaw Pact.” Millennium 14 (3): 292–316. https://doi.org/10.1177/03058298850140030401.
Odehnal, Jakub, and Jiří Neubauer. 2020. “Economic, Security, and Political Determinants of Military Spending in NATO Countries.” Defence and Peace Economics 31 (5): 517–31. https://doi.org/10.1080/10242694.2018.1544440.
Office of the Secretary of Defense. 2018. “Military and Security Developments Involving the People’s Republic of China 2018.” Annual {{Report}} to {{Congress}} 8-0F67E5F. Department of Defense.
Omitoogun, Wuyi, and Elisabeth Skons. 2006. “Military Expenditure Data: A 40-Year Overview.” In SIPRI Yearbook 2006: Armaments, Disarmament and International Security, 269–94. Stockholm International Peace Research Institute.
Pape, Robert A. 1996. Bombing to Win: Air Power and Coercion in War. Cornell University Press.
Perlo-Freeman, Sam. 2017. “Monitoring Military Expenditure.” SIPRI.
Posen, Barry R. 1984. “Measuring the European Conventional Balance: Coping with Complexity in Threat Assessment.” International Security 9 (3): 47–88.
Post, Abigail. 2019. “Flying to Fail: Costly Signals and Air Power in Crisis Bargaining.” Journal of Conflict Resolution 63 (4): 869–95. https://doi.org/10.1177/0022002718777043.
Raths, Ralf. 2011. “German Tank Production and Armoured Warfare, 1916.” War & Society 30 (1): 24–47. https://doi.org/10.1179/204243410X12880157235369.
Rosen, Stephen Peter. 1982. “Vietnam and the American Theory of Limited War.” International Security 7 (2): 83–113. https://doi.org/10.2307/2538434.
———. 1991. Winning the Next War: Innovation and the Modern Military. Cornell University Press.
Russett, Bruce M. 1971. “An Empirical Typology of International Military Alliances.” Midwest Journal of Political Science 15 (2): 262–89. https://doi.org/10.2307/2110272.
Sample, Susan G., Brandon Valeriano, and Choong-Nam Kang. 2013. “The Societal Determinants and Impact of Military Spending Patterns.” Journal of Political and Military Sociology 41: 109–35.
Saunders, Elizabeth N. 2015. “War and the Inner Circle: Democratic Elites and the Politics of Using Force.” Security Studies 24 (3): 466–501. https://doi.org/10.1080/09636412.2015.1070618.
Saunders, Richard, and Mark Souva. 2020. “Command of the Skies: An Airpower Dataset.” Conflict Management and Peace Science 37 (6): 735–55. https://doi.org/10.1177/0738894219863348.
Schilde, Kaija. 2017. “European Military Capabilities: Enablers and Constraints on EU Power?” JCMS: Journal of Common Market Studies 55 (1): 37–53. https://doi.org/10.1111/jcms.12444.
Schwartz, Joshua A., and Michael C Horowitz. 2021. “To Compete or Retreat? The Global Diffusion of Precision Strike.” Working {{Paper}}.
Sechser, Todd S., and Elizabeth N. Saunders. 2010. “The Army You Have: The Determinants of Military Mechanization, 1979.” International Studies Quarterly 54 (2): 481–511. https://doi.org/10.1111/j.1468-2478.2010.00596.x.
Slantchev, Branislav L. 2003a. “The Power to Hurt: Costly Conflict with Completely Informed States.” The American Political Science Review 97 (1): 123–33. https://doi.org/10.2307/3118225.
———. 2003b. “The Principle of Convergence in Wartime Negotiations.” American Political Science Review 97 (4): 621–32. https://doi.org/10.1017/S0003055403000911.
Snyder, Jack. 1989. The Ideology of the Offensive: Military Decision Making and the Disasters of 1914. Cornell University Press.
Sorley, Lewis. 1999. A Better War: The Unexamined Victories and Final Tragedy of America’s Last Years in Vietnam. Harcourt Brace & Company.
Stanton, Jessica A. 2013. “Terrorism in the Context of Civil War.” The Journal of Politics 75 (4): 1009–22. https://doi.org/10.1017/S0022381613000984.
Sundstrom, Lisa McIntosh. 2005. “Foreign Assistance, International Norms, and NGO Development: Lessons from the Russian Campaign.” International Organization 59 (2): 419–49.
Talmadge, Caitlin. 2016. “Different Threats, Different Militaries: Explaining Organizational Practices in Authoritarian Armies.” Security Studies 25 (1): 111–41. https://doi.org/10.1080/09636412.2016.1134192.
———. 2019. “Emerging Technology and Intra-War Escalation Risks: Evidence from the Cold War, Implications for Today.” Journal of Strategic Studies 42 (6): 864–87. https://doi.org/10.1080/01402390.2019.1631811.
Tuchman, Barbara Wertheim. 1962. The Guns of August. Macmillan.
van Creveld, Martin. 2010. Technology and War: From 2000 B.C. To the Present. Simon and Schuster.
Varol, Onur, Emilio Ferrara, Christine L. Ogan, Filippo Menczer, and Alessandro Flammini. 2014. “Evolution of Online User Behavior During a Social Upheaval.” arXiv:1406.7197 [Physics], 81–90. https://doi.org/10.1145/2615569.2615699.
Walter, Barbara. 2006. “Building Reputation: Why Governments Fight Some Separatists but Not Others.” American Journal of Political Science 50 (2): 313–30. https://doi.org/10.1111/j.1540-5907.2006.00186.x.
Whitten, Guy D., and Laron K. Williams. 2011. “Buttery Guns and Welfare Hawks: The Politics of Defense Spending in Advanced Industrial Democracies.” American Journal of Political Science 55 (1): 117–34. https://doi.org/10.1111/j.1540-5907.2010.00479.x.
Willbanks, James H. 2004. Machine Guns: An Illustrated History of Their Impact. ABC-CLIO.
Wohlforth, William C. 1999. “The Stability of a Unipolar World.” International Security 24 (1): 5–41. https://doi.org/10.1162/016228899560031.

  1. Email: . Web: . See for a website of the complete project. Data and code for the empirical analysis can be found at . This projected was funded and produced by the UC San Diego Center for Peace and Security Studies.↩︎

  2. Of course, these two are not synonymous. Military capabilities are only one component of military spending and the cost of labor is a large component of military spending (Fordham 2002; Whitten and Williams 2011).↩︎

  3. I use percent of years since not all countries exist across the entire duration of the data. 100% of Slovenia is covered, for example, because data exists for all 22 years since since it established independence in 1991.↩︎

  4. Quotes come from IISS Testimonials↩︎

  5. While these 5 classifications levels are produced by IISS, their labels are the author’s.↩︎

  6. Matching various unit name string variables is a challenging endeavor. For more information about using the unit-level information in , see the appendix.↩︎

  7. Since the data starts in 1970, tanks first deployed in 1970 actually likely represent models developed before then. A more thorough analysis would track down the actual deployment date for each tank model, rather than relying on their deployment date as done here.↩︎

  8. There are cases where an equipment’s category changes in ways the data maintains. For example, many aircraft and helicopters are phased out by being shifted to non-combat roles like training before they are fully retired. A country may thus experience a decrease in combat aircraft and an increase in training aircraft from one year to the next without the actual aircraft they possess changing.↩︎

  9. For existing work on missile proliferation, see Kahn and Horowitz (2021) and Schwartz and Horowitz (2021).↩︎

  10. New data on combat aircraft has recently been produced by R. Saunders and Souva (2020).↩︎

  11. I exclude states with a population below 750,000 as done by Eyre and Suchman (1996) and Sechser and Saunders (2010).↩︎

  12. This clustering method has been used for community detection of economic industry clusters (Kali et al. 2013; Delgado, Porter, and Stern 2016), preferential trade agreement (PTA) membership (Hafner-Burton and Montgomery 2009, 31–34), military alliances (Russett 1971; Li 2010), and social media behavior during protest movements (Varol et al. 2014).↩︎

  13. Data on civil war occurrence comes from the UCDP/PRIO Armed Conflict Dataset version 20.1 (Gleditsch et al. 2002).↩︎

LS0tCnRpdGxlOiAnXHNpbmdsZXNwYWNpbmcgUGxhbmVzLCBUcmFpbnMsIGFuZCBBcm1vcmVkIE1vYmlsZXM6IEludHJvZHVjaW5nIGEgRGF0YXNldCBvZiB0aGUgR2xvYmFsIERpc3RyaWJ1dGlvbiBvZiBNaWxpdGFyeSBDYXBhYmlsaXRpZXMgKHJETUMpJwphdXRob3I6IHwgCiAgfCBCZWxmZXIgQ2VudGVyIGZvciBTY2llbmNlIGFuZCBJbnRlcm5hdGlvbmFsIEFmZmFpcnMKICB8IEhhcnZhcmQgS2VubmVkeSBTY2hvb2wKICB8ICBKIEFuZHIkXCd7ZX0kcyBHYW5ub25eW0VtYWlsOiBcdGV4dHR0e2phZ2Fubm9uQGhrcy5oYXJ2YXJkLmVkdX0uIFdlYjogXHRleHR0dHtqYW5kcmVzZ2Fubm9uLmNvbX0uIFxuZXdsaW5lIFNlZSBcdGV4dHR0e2h0dHBzOi8vd3d3Lm1pbGl0YXJ5Y2FwYWJpbGl0aWVzLmNvbS99IGZvciBhIHdlYnNpdGUgb2YgdGhlIGNvbXBsZXRlIHByb2plY3QuIERhdGEgYW5kIGNvZGUgZm9yIHRoZSBlbXBpcmljYWwgYW5hbHlzaXMgY2FuIGJlIGZvdW5kIGF0IFx0ZXh0dHR7aHR0cHM6Ly9naXRodWIuY29tL0NlbnRlckZvclBlYWNlQW5kU2VjdXJpdHlTdHVkaWVzL3JETUN9LiBUaGlzIHByb2plY3RlZCB3YXMgZnVuZGVkIGFuZCBwcm9kdWNlZCBieSB0aGUgVUMgU2FuIERpZWdvIENlbnRlciBmb3IgUGVhY2UgYW5kIFNlY3VyaXR5IFN0dWRpZXMuXQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiCm91dHB1dDoKICBib29rZG93bjo6aHRtbF9ub3RlYm9vazI6CiAgICBmaWdfaGVpZ2h0OiA4CiAgICBmaWdfd2lkdGg6IDEyCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHllcwogIGJvb2tkb3duOjpwZGZfZG9jdW1lbnQyOgogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogbm8KICAgIGtlZXBfdGV4OiB5ZXMKICBib29rZG93bjo6d29yZF9kb2N1bWVudDI6IGRlZmF1bHQKICBib29rZG93bjo6d29yZF9kb2N1bWVudDoKICAgIHRvYzogbm8Kc2l0ZTogYm9va2Rvd246OmJvb2tkb3duX3NpdGUKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQphYnN0cmFjdDogXHNpbmdsZXNwYWNpbmcgXG5vaW5kZW50IFRoaXMgYXJ0aWNsZSBpbnRyb2R1Y2VzIHRoZSBEaXN0cmlidXRpb24gb2YgTWlsaXRhcnkgQ2FwYWJpbGl0aWVzIChyRE1DKSBkYXRhc2V0LiBJdCBiZWdpbnMgYnkgZXhwbGFpbmluZyB0aGUgdmFsdWUgb2YgY29sbGVjdGluZyBkYXRhIG9uIGRpc2FnZ3JlZ2F0ZWQgbmF0aW9uYWwgbWlsaXRhcnkgY2FwYWJpbGl0aWVzLCBpdHMgc2NvcGUsIGFuZCB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MuIEkgdGhlbiBpZGVudGlmeSBzb21lIGluaXRpYWwgdHJlbmRzIGFib3V0IGNoYW5nZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgYWNyb3NzIHN0YXRlcyBmcm9tIDE5NzAgLS0gMjAxNC4gSSBjb25jbHVkZSBieSBpZGVudGlmeWluZyBmdXR1cmUgcmVzZWFyY2ggdXNlIG9mIHRoZSBkYXRhIGFzIGJvdGggYSBkZXBlbmRlbnQgYW5kIGluZGVwZW5kZW50IHZhcmlhYmxlLgpoZWFkZXItaW5jbHVkZXM6Ci0gXHVzZXBhY2thZ2V7dGlren0KLSBcdXNlcGFja2FnZXtwZ2ZwbG90c30KLSBccGdmcGxvdHNzZXR7Y29tcGF0PW5ld2VzdH0KLSBcdXNldGlremxpYnJhcnl7cGxvdG1hcmtzfQotIFx1c2V0aWt6bGlicmFyeXthcnJvd3MubWV0YX0KLSBcdXNlcGdmcGxvdHNsaWJyYXJ5e3BhdGNocGxvdHN9Ci0gXHVzZXBhY2thZ2V7Z3JmZmlsZX0KLSBcdXNlcGFja2FnZXtjYXB0aW9ufQotIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQotIFx1c2VwYWNrYWdlW2RvdWJsZXNwYWNpbmdde3NldHNwYWNlfQotIFx1c2VwYWNrYWdle2Zsb2F0fQotIFx1c2VwYWNrYWdle211bHRpcm93fQpiaWJsaW9ncmFwaHk6IHJETUMtYmliLmJpYgotLS0KCmBgYHtyIGtuaXRyX29wdGlvbnMsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQojIGFkZGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGhvbWUgaG9sZGVyIGlzIHRoZSByZXBvIGZvbGRlcgpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KGdncGxvdDIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gbm9ybWFsaXplUGF0aChoZXJlOjpoZXJlKCkpKQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVycm9yID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLnBvcyA9ICJIIiwgb3V0LmV4dHJhID0gIiIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCmBgYHtyIGxvYWQgZGF0YX0KcmRtY19yYXcgPC0gcmVhZFJEUyhmaWxlID0gcGFzdGUwKGhlcmU6OmhlcmUoKSwgIi9kYXRhLzAxel9yRE1DX3Jhdy5yZHMiKSkKcmRtY19sb25nIDwtIHJlYWRSRFMoZmlsZSA9IHBhc3RlMChoZXJlOjpoZXJlKCksICIvZGF0YS8wMXpfckRNQ19sb25nLnJkcyIpKQpyZG1jX3dpZGUgPC0gcmVhZFJEUyhmaWxlID0gcGFzdGUwKGhlcmU6OmhlcmUoKSwgIi9kYXRhLzAxel9yRE1DX3dpZGUucmRzIikpCmBgYAoKXG5ld3BhZ2UKCiMgSW50cm9kdWN0aW9uClRoZSBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgc3RhdGVzIHBvc3Nlc3MgYXJlIGFuIGltcG9ydGFudCBpbnN0cnVtZW50IG9mIG1pbGl0YXJ5IHBvd2VyLCBhbmQgY29uc2VxdWVudGx5IG5hdGlvbmFsIHBvd2VyIFtAbW9yZ2VudGhhdV9wb2xpdGljc25hdGlvbnNfMTk0OF0uIFlldCBleGlzdGluZyB3b3JrIG9uIGJvdGggdGhlIGNhdXNlcyBhbmQgY29uc2VxdWVuY2VzIG9mIG1pbGl0YXJ5IHBvd2VyIGFyZSBsaW1pdGVkIGluIGVtcGlyaWNhbCBpZGVudGlmaWNhdGlvbiB0byBjb2Fyc2UgbWVhc3VyZXMgbGlrZSBtaWxpdGFyeSBzcGVuZGluZyBvciBtaWxpdGFyeSBwZXJzb25uZWwuIE5vdCBhbGwgc29sZGllcnMgYXJlIGNyZWF0ZWQgZXF1YWwsIGFuZCBtdWNoIGhhcyBiZWVuIHNhaWQgYWJvdXQgdGhlIHByb2JsZW1zIG9mIG1lYXN1cmluZyBtaWxpdGFyeSBwb3dlciB1c2luZyBtaWxpdGFyeSBzcGVuZGluZyBmaWd1cmVzIFtAcGVybG8tZnJlZW1hbl9tb25pdG9yaW5nbWlsaXRhcnlleHBlbmRpdHVyZV8yMDE3XSBvciBhZ2dyZWdhdGUgbWVhc3VyZXMgbGlrZSB0aGUgY29tcG9zaXRlIGluZGV4IG9mIG5hdGlvbmFsIGNhcGFiaWxpdGllcyAoQ0lOQykgW0BjYXJyb2xsX3ByZWRpY3Rpb25wcm94aWVzcG93ZXJfMjAxOV0uIFdoaWxlIG1pbGl0YXJ5IHRlY2hub2xvZ3kgaXMgb25lIG9mIG9ubHkgbWFueSBjb21wb25lbnRzIG9mIG1pbGl0YXJ5IHBvd2VyIChhbmQgbWlsaXRhcnkgZXF1aXBtZW50IG9ubHkgb25lIGRpbWVuc2lvbiBvZiBtaWxpdGFyeSB0ZWNobm9sb2d5KSwgaXRzIGVmZmVjdHMgYXJlIHNpZ25pZmljYW50LCBpZiBob3RseSBkZWJhdGVkLiBXaXRob3V0IGRlbnlpbmcgdGhlIGltcG9ydGFuY2Ugb2Ygbm9uLXRlY2hub2xvZ2ljYWwgZmFjdG9ycyBsaWtlIG1pbGl0YXJ5IGN1bHR1cmUsIGluc3RpdHV0aW9ucyBhbmQgZG9jdHJpbmUgW0BsaWViZXJfd2FyZW5naW5lZXJzcHJpbWFjeV8yMDA1OyBAYnJvb2tzX2NyZWF0aW5nbWlsaXRhcnlwb3dlcl8yMDA3XSwgaW5jb25zaXN0ZW50IGZpbmRpbmdzIGFib3V0IHRoZSByb2xlIG9mIHRlY2hub2xvZ3kgaW4gY29uZmxpY3Qgc3RlbSBub3QgZnJvbSB0aGUgZmFjdCB0aGF0IHRlY2hub2xvZ3kgZG9lcyBub3QgbWF0dGVyLCBidXQgcmF0aGVyIGl0IGhhcyBiZWVuIGltcHJvcGVybHkgaWRlbnRpZmllZCBhbmQgY29hcnNlbHkgbWVhc3VyZWQgW0B2YW5jcmV2ZWxkX3RlY2hub2xvZ3l3YXIyMDAwXzIwMTA7IEBicm9va3NfcmlzZWZhbGxncmVhdF8yMDE2XS4KCQpUaGlzIHBhcGVyIHNlZWtzIHRvIGNvbnRyaWJ1dGUgdG8gb25nb2luZyByZXNlYXJjaCBhYm91dCB0aGUgY2F1c2VzIGFuZCBjb25zZXF1ZW5jZXMgb2YgbWlsaXRhcnkgcG93ZXIgYnkgcHJvZHVjaW5nIHRoZSBmaXJzdCBjb21wcmVoZW5zaXZlIGRhdGFzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgYWNyb3NzIGFsbCBzdGF0ZXMgZnJvbSAxOTcwIC0tIDIwMTQuIERpc2FnZ3JlZ2F0aW5nIG1pbGl0YXJ5IHBvd2VyIGludG8gaXRzIGNvbXBvbmVudCBwYXJ0cyBpcyBhbiBpbXBvcnRhbnQsIHlldCB1bmRlcmRldmVsb3BlZCwgZW50ZXJwcmlzZS4gV2hpbGUgYWdncmVnYXRlIG1pbGl0YXJ5IHNwZW5kaW5nIG1heSBoZWxwIGRpZmZlcmVudGlhdGUgbGFyZ2UgYW5kIGdsb2JhbGx5IGNhcGFibHkgbWlsaXRhcmllcyBmcm9tIHNtYWxsZXIgb25lcywgaXQgcmlza3MgY29uZmxhdGluZyBkaWZmZXJlbmNlcyBpbiB0aGUgXHRleHRpdHtjb21wb3NpdGlvbn0gb2Ygbm9taW5hbGx5IGVxdWl2YWxlbnRseSBzaXplZCBtaWxpdGFyaWVzLiBUaGUgY29tcG9zaXRpb24gb2YgYSBzdGF0ZSdzIG5hdnkgbWF5IGluZmx1ZW5jZSBpdHMgdGhyZWF0cywgcG93ZXIgcHJvamVjdGlvbiwgYW5kIHdhcmZpZ2h0aW5nIGNhcGFiaWxpdGllcyBpbiBzb21lIGNvbmZsaWN0cywgYnV0IG5vdCBvdGhlcnMgW0BjYXZlcmxleV90b29pbXBvcnRhbnRiZV8yMDIwOyBAZ2FydHprZV9pbmZsdWVuY2VzZWFwb3dlcl8yMDIwXSwgYW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbWlsaXRhcnkgdGVjaG5vbG9naWVzIGEgY291bnRyeSBjb3VsZCBhY3F1aXJlLCBhY3R1YWxseSBwb3NzZXNzZXMsIGFuZCBzdWJzZXF1ZW50bHkgdXNlcyBpbiBhIGNvbnRlc3QgY291bGQgc2hlZCBsaWdodCBvbiBjb250cmFzdGluZyBmaW5kaW5ncyBhYm91dCB0aGUgaW1wYWN0IG9mIG1pbGl0YXJ5IGNhcGFiaWxpdGllcyBvbiBpbnRlcm5hdGlvbmFsIGFmZmFpcnMgW0Bkb3VnbGFzc19jaHVybmluZ2J1dHRlcmd1bnNfMjAxOV0uCgpUaGlzIHBhcGVyIHByb2NlZWRzIGFzIGZvbGxvd3MuIFNlY3Rpb24gMiBpZGVudGlmaWVzIHRoZSByb2xlIHRoYXQgbWlsaXRhcnkgdGVjaG5vbG9neSBwbGF5cyBhcyBib3RoIGFuIGltcG9ydGFudCBjYXVzZSBhbmQgY29uc2VxdWVuY2UgaW4gdGhlIHN0dWR5IG9mIGludGVybmF0aW9uYWwgcG9saXRpY3MuIFNlY3Rpb24gMyBvdXRsaW5lcyB0aGUgc2NvcGUgb2YgdGhlIG5ld2x5IHByb2R1Y2VkIERpc3RyaWJ1dGlvbiBvZiBNaWxpdGFyeSBDYXBhYmlsaXRpZXMgKHJETUMpIGRhdGFzZXQuIFNlY3Rpb24gNCBicmllZmx5IGRlc2NyaWJlcyB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MuIFNlY3Rpb24gNSBpZGVudGlmaWVzIHNvbWUgaW5pdGlhbCB0cmVuZHMgaW4gdmFyaWF0aW9uIGluIHRoZSBkaXN0cmlidXRpb24gb2YgbWlsaXRhcnkgY2FwYWJpbGl0aWVzIGFjcm9zcyB0aW1lIGFuZCBzcGFjZSBhbmQgU2VjdGlvbiA2IGNvbmNsdWRlcy4KCiMgU2lnbmlmaWNhbmNlCk1vc3Qgb2YgdGhlIHJlc2VhcmNoIG9uIGludGVybmF0aW9uYWwgY29uZmxpY3QgaGFzIGZvY3VzZWQgb24gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHdhciAtLSBpdHMgY2F1c2VzIGFuZCBjb25zZXF1ZW5jZXMuIEhvd2V2ZXIsIHRoZSBjb25kdWN0IG9mIGNvbmZsaWN0LCB3aGV0aGVyIGFjdHVhbCBvciBsYXRlbnQsIGhhcyBtdWNoIHRvIHRlbGwgdXMgYWJvdXQgd2FyJ3MgY2F1c2VzIGFuZCBjb25zZXF1ZW5jZXMgW0Bib290X3dhcm1hZGVuZXdfMjAwNjsgQGJpZGRsZV9zdHJhdGVneXdhcl8yMDA3XS4gUmVnYXJkaW5nIGl0cyBjYXVzZXMsIGlmLCBhcyBDbGF1c2V3aXR6IG5vdGVkLCB3YXIgaXMgdGhlIGNvbnRpbnVhdGlvbiBvZiBwb2xpdGljcyB3aXRoIG90aGVyIG1lYW5zLCB0aGVuIHRoZSB0b29scyB1c2VkIGZvciB3YXIgXHRleHRpdHthcmV9IHRoZSBvdGhlciBtZWFucy4gTWlsaXRhcnkgbWVhbnMgXHRleHRpdHttaWdodH0gbWF0dGVyLCBidXQgZXZhbHVhdGluZyB3aGV0aGVyIHRoZXkgZG8gKGFuZCBpZiBzbywgdGhlIGRlZ3JlZSBhbmQgY2lyY3Vtc3RhbmNlKSBpcyBhbiBpbXBvc3NpYmxlIGVuZGVhdm9yIHdpdGhvdXQgZW1waXJpY2FsIGRhdGEgb24gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aG9zZSBtZWFucyBhY3Jvc3MgdGltZSBhbmQgc3BhY2UuIElmIGl0IHR1cm5zIG91dCB0aGF0IG1pbGl0YXJ5IG1lYW5zIGRvIG1hdHRlciwgdGhlbiBDbGF1c2V3aXR6J3MgcG9pbnQgaXMgdGhhdCB1bmRlcnN0YW5kaW5nIHRoZXNlIG1lYW5zIGZ1bmRhbWVudGFsbHkgc2hhcGVzIG91ciB1bmRlcnN0YW5kaW5nIG9mIHdhciBhcyBhIHBvbGl0aWNhbCBwcm9jZXNzLiBXaGF0IGEgY291bnRyeSBpcyBhYmxlIHRvIGFjY29tcGxpc2ggd2l0aCBtaWxpdGFyeSBmb3JjZSBpbiBhIHNwZWNpZmljIHNpdHVhdGlvbiBpcyBhIGZ1bmN0aW9uIG9mIG1pbGl0YXJ5IHRlY2hub2xvZ3ksIG9yZ2FuaXphdGlvbiwgYW5kIGRvY3RyaW5lIGFuZCB0aGUgbWFubmVyIGluIHdoaWNoIHRoZXNlIHRoaW5ncyByZWxhdGUgd2l0aCB0aGUgcG9saXRpY2FsIGFuZCBnZW9ncmFwaGljIGNpcmN1bXN0YW5jZXMgYXQgaGFuZCBbQGJldHRzX3Nob3VsZHN0cmF0ZWdpY3N0dWRpZXNfMTk5N10uIFJlZ2FyZGluZyB3YXIncyBjb25zZXF1ZW5jZXMsIHRoZSBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgYXZhaWxhYmxlIHRvIGFjdG9ycyBwbGF5IGEgcm9sZSBpbiBkZXRlcm1pbmluZyB3aGV0aGVyIGJsb29kc2hlZCBpcyBwcmVmZXJhYmxlIHRvIHJlc29sdmluZyB0aGUgZGlzcHV0ZSB0aHJvdWdoIGEgbmVnb3RpYXRlZCBzZXR0bGVtZW50IFtAc2xhbnRjaGV2X3ByaW5jaXBsZWNvbnZlcmdlbmNld2FydGltZV8yMDAzXS4gCgpUaGUgaW5ub3ZhdGlvbiwgYWNxdWlzaXRpb24sIGFuZCBvcmdhbml6YXRpb24gb2YgbWlsaXRhcnkgdGVjaG5vbG9neSBpcyBhbiBpbXBvcnRhbnQgZGV0ZXJtaW5hbnQgb2YgbmF0aW9uYWwgbWlsaXRhcnkgZm9yY2Ugc2luY2UgaXQgY29tcHJpc2VzIHRoZSB0b29scyBhdmFpbGFibGUgZm9yIHRoZSByZXNvbHV0aW9uIG9mIGludGVybmF0aW9uYWwgZGlzcHV0ZXMuIFRoZSBjb21iaW5hdGlvbiBvZiBjYXBhYmlsaXRpZXMgdGhhdCBjb21wcmlzZSBhIG1pbGl0YXJ5J3MgdG9vbGtpdCBkZXRlcm1pbmUgdGhlIG9wZXJhdGlvbnMgaXQgdW5kZXJ0YWtlcywgdGhlIHR5cGVzIG9mIHRocmVhdHMgaXQgY2FuIGNyZWRpYmx5IG1ha2UsIGFuZCB0aGUgY29uc2VxdWVuY2VzIG9mIHJlc29ydGluZyB0byBmb3JjZSBbQGJ1emFuX2ludHJvZHVjdGlvbnN0cmF0ZWdpY3N0dWRpZXNfMTk4N10uIEluIG90aGVyIGNhc2VzLCBtaWxpdGFyeSB0ZWNobm9sb2d5IGhhcyBoYWQgY29udHJhc3RpbmcgY29uc2VxdWVuY2VzIGluIHRoZSBzYW1lIGNvbmZsaWN0IGRlc3BpdGUgcHJpb3IgZXhwZWN0YXRpb25zIG9mIGNvbnNpc3RlbmN5LiBEdXJpbmcgdGhlIDE4NzkgQW5nbG8tWnVsdSBXYXIsIHRoZSBVbml0ZWQgS2luZ2RvbSBleHBlY3RlZCB0aGVpciBmaXJlYXJtcyAtLSBhbmQgdGhlIGxhY2sgb2YgYW55IFp1bHUgY29udGFjdCB3aXRoIGZpcmVhcm1zIC0tIHRvIHByb3ZpZGUgYSBzaWduaWZpY2FudCB0YWN0aWNhbCBhZHZhbnRhZ2UgW0BndXlfbm90ZWZpcmVhcm1zenVsdV8xOTcxXS4gSG93ZXZlciwgdGhlIFVuaXRlZCBLaW5nZG9tIHN1ZmZlcmVkIGEgc2VyaW91cyBsb3NzIGF0IElzYW5kbHdhbmEgZGVzcGl0ZSBiZWluZyBhcm1lZCB3aXRoIHRoZSBNYXJ0aW5pLUhlbnJ5IHJpZmxlIFtAYmVja2V0dF9yZXRyb3NwZWN0aXZlaWNvbm1hcnRpbmloZW5yeV8yMDEzXS4gQWZ0ZXIgdGhpcyByZXNvdW5kaW5nIGRlZmVhdCwgdGhlIEJyaXRpc2ggc2hpZnRlZCB0aGVpciB0ZWNobm9sb2dpY2FsIHN0cmF0ZWd5IGJ5IGRlcGxveWluZyB0aGUgcmVjZW50bHkgaW52ZW50ZWQgR2F0bGluZyBndW4gd2hpY2ggYWxsb3dlZCB0aGUgbXVjaCBzbWFsbGVyIEJyaXRpc2ggYXJteSB0byBvdmVyd2hlbG0gdGhlIFp1bHUgdHJpYmVzIGluIGEgbWF0dGVyIG9mIG1pbnV0ZXMgQHdpbGxiYW5rc19tYWNoaW5lZ3Vuc2lsbHVzdHJhdGVkXzIwMDRbMzNdLiBUd28gY2FzZXMgb2YgdGVjaG5vbG9naWNhbCBzdXBlcmlvcml0eSB3ZXJlIGFzc29jaWF0ZWQgd2l0aCBjb250cmFzdGluZyBvdXRjb21lcywgcG9pbnRpbmcgdG8gdGhlIGltcG9ydGFuY2Ugb2YgaWRlbnRpZnlpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHRlY2hub2xvZ3kgaW4gd2FyZmFyZSByYXRoZXIgdGhhbiBqdXN0IHRoZSBwcmVzZW5jZSBvZiBpbm5vdmF0aW9uLgoJClRoZSB3aWRlIGJvZHkgb2YgbGl0ZXJhdHVyZSBzdHVkeWluZyB3YXIgaGFzIHJlY29nbml6ZWQgdGhlIGRlZ3JlZSB0byB3aGljaCB0aGVzZSBjb25jZXJucyBhcmUgc2hhcGVkIGJ5IFx0ZXh0aXR7aG93fSBzdGF0ZXMgZmlnaHQuIElmIHNjaG9sYXJzIHVuZGVyc3RhbmQgdGhlIHByb2Nlc3MgYnkgd2hpY2ggc3RhdGVzIG1ha2UgY2hvaWNlcyBhYm91dCB3aGF0IG1pbGl0YXJ5IGNhcGFiaWxpdGllcyB0aGV5IHBvc3Nlc3MsIHRoZXkgY2FuIGJldHRlciB1bmRlcnN0YW5kIGhvdyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aG9zZSBjYXBhYmlsaXRpZXMgaW1wYWN0IG91dGNvbWVzIG9mIGludGVyZXN0IFtAY2Fmb3Jpb19pbnRyb2R1Y3Rpb25pbnRlcmRpc2NpcGxpbmFyeWNyb3NzbmF0aW9uYWxfMjAwNl0uIFRoZSB0b29scyB0aGF0IGNvbXByaXNlIG5hdGlvbmFsIG1pbGl0YXJ5IGZvcmNlIGluZmx1ZW5jZSB3YXIncyBwYXJ0aWNpcGFudHMgW0Bmb3JkaGFtX3ZlcnlzaGFycHN3b3JkXzIwMDQ7IEBiZWNrbGV5X2VtZXJnaW5nbWlsaXRhcnliYWxhbmNlXzIwMTddLCB2aWN0b3JzIFtAcm9zZW5fd2lubmluZ25leHR3YXJfMTk5MTsgQGx5YWxsX3JhZ2VtYWNoaW5lc2V4cGxhaW5pbmdfMjAwOTsgQGNhcHBlbGxhemllbGluc2tpX29yZ2FuaXppbmdwZXJmb3JtYW5jZWNvYWxpdGlvbl8yMDIwXSwgY29zdHMgW0BjYXZlcmxleV9kZW1vY3JhdGljbWlsaXRhcmlzbXZvdGluZ18yMDE0OyBAdGFsbWFkZ2VfZW1lcmdpbmd0ZWNobm9sb2d5aW50cmF3YXJfMjAxOV0sIGxvY2F0aW9uIFtAc2NoaWxkZV9ldXJvcGVhbm1pbGl0YXJ5Y2FwYWJpbGl0aWVzXzIwMTc7IEBjcmlzaGVyX25hdmFscG93ZXJlbmRvZ2VuZWl0eV8yMDE3XSwgYW5kIGR1cmF0aW9uIFtAbWFydGluZXptYWNoYWluX2FpcmNhbXBhaWduZHVyYXRpb25fMjAxNTsgQGNhcHBlbGxhemllbGluc2tpX3BvbGl0aWNhbGVjb25vbXluYXRpb25hbF8yMDE2OyBAY2F2ZXJsZXlfbWlsaXRhcnl0ZWNobm9sb2d5ZHVyYXRpb25fMjAxN10gYXMgd2VsbCBhcyBwb3dlciBwcm9qZWN0aW9uIFtAY29yYmV0dF9wcmluY2lwbGVzbWFyaXRpbWVzdHJhdGVneV8xOTExOyBAYmVhc2xleV9jbG9zaW5ncHJlc2VuY2VnYXBfMjAxNV0sIHdoYXQgaXNzdWVzIGFyZSByZXNvbHZlZCB3aXRoIGZvcmNlIFtAYWxsaXNvbl9hcm1hbWVudHNhcm1zY29udHJvbF8xOTc1OyBAYmVja2VyX2NsZWFyaW5nYWlydHJhbnNhdGxhbnRpY18yMDE3XSwgd2hhdCB0aHJlYXRzIGFyZSBjcmVkaWJsZSBbQGJ1emFuX2FybXNkeW5hbWljd29ybGRfMTk5ODsgQHNsYW50Y2hldl9wb3dlcmh1cnRjb3N0bHlfMjAwMzsgQHBvc3RfZmx5aW5nZmFpbGNvc3RseV8yMDE5OyBAbW9udGdvbWVyeV9zaWduYWxzc3RyZW5ndGhjYXBhYmlsaXR5XzIwMjBdLCByZXB1dGF0aW9uIFtAZXJpY2tzb25fZGFuZ2Vyb3VzdHJhZGVhcm1zXzIwMThdLCBhbmQgdGhlIGJhbGFuY2Ugb2YgcG93ZXIgW0BnbGFzZXJfcG9saXRpY2FsY29uc2VxdWVuY2VzbWlsaXRhcnlfMTk5MjsgQGhvcm93aXR6X2RpZmZ1c2lvbm1pbGl0YXJ5cG93ZXJfMjAxMDsgQGdhcnR6a2VfZGV0ZXJtaW5hbnRzbnVjbGVhcmZvcmNlXzIwMTRdLgoKVGhlIHBvcnRmb2xpbyBvZiBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgYWxzbyBpbmZvcm1zIGJyb2FkZXIgcXVlc3Rpb25zIG91dHNpZGUgdGhlIHRyYWRpdGlvbmFsIHNjb3BlIG9mIGludGVybmF0aW9uYWwgc2VjdXJpdHkgbGlrZSB3aGVuIGNvdXBzIHN1Y2NlZWQgW0B0YWxtYWRnZV9kaWZmZXJlbnR0aHJlYXRzZGlmZmVyZW50XzIwMTY7IEBjYXZlcmxleV9taWxpdGFyeXRlY2hub2xvZ3lkdXJhdGlvbl8yMDE3XSBhbmQgY2l2aWwtbWlsaXRhcnkgcmVsYXRpb25zIFtAZm9yc3Rlcl9hcm1lZGZvcmNlc3NvY2lldHlfMjAwNTsgQGJyb29rc19zaGFwaW5nc3RyYXRlZ3ljaXZpbG1pbGl0YXJ5XzIwMDg7IEBrYWRlcmNhbl9zdHJvbmdhcm1pZXNzbG93XzIwMTRdLiBJbiB0aGUgZWFybHkgMTk3MiwgdGhlIGhlYWQgb2YgdGhlIEJhbmdsYWRlc2hpIGdvdmVybm1lbnQgc3VjY2Vzc2Z1bGx5IGhlbGQgb2ZmIGEgY291cCBieSBjcmVhdGluZyBhIHNwZWNpYWwgc2VjdXJpdHkgZm9yY2UgKHRoZSBKYXRpbyBSYWtraGkgQmFoaW5pKSBvZiBsb3lhbCBmb3JjZXMuIFR3byB5ZWFycyBsYXRlciwgaG93ZXZlciwgQmFuZ2xhZGVzaCBwdXJjaGFzZWQgMzAgVC01NCB0YW5rcyBmcm9tIFBha2lzdGFuIHdoaWNoIGFsbG93ZWQgdGhlIGFybXkgdG8gb3ZlcnRha2UgdGhlIHNwZWNpYWwgc2VjdXJpdHkgZm9yY2VzIGluIGEgc3Rvcm0gb2YgdGhlIHByZXNpZGVudCdzIHJlc2lkZW5jZSwgcmVzdWx0aW5nIGluIGhpcyBkZWF0aCBhbmQgYW4gb3ZlcnRocm93IG9mIHRoZSBzZWN1bGFyIGdvdmVybm1lbnQgW0BtYW5pcnV6emFtYW5fYXJtc3RyYW5zZmVyc21pbGl0YXJ5XzE5OTIsIDc0NS03NDddLgoJClRoZSBzdHVkeSBvZiBkb21lc3RpYyBwb2xpdGljcyBoYXMgYWxzbyByZWNvZ25pemVkIHRoZSBpbXBvcnRhbmNlIG9mIG1pbGl0YXJ5IGNhcGFiaWxpdGllcy4gVGVuc2lvbiBiZXR3ZWVuIHBvbGl0aWNhbCBidWRnZXQgY29uc3RyYWludHMgYW5kIG1pbGl0YXJ5IHNlY3VyaXR5IGRlc2lyZXMgZ2V0cyB0byB0aGUgaGVhcnQgb2YgdGhlIHJvbGUgdGhhdCBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgcGxheSBpbiBmdXJ0aGVyaW5nIG91ciB1bmRlcnN0YW5kaW5nIG9mIG5hdGlvbmFsIHBvbGl0aWNzIFtAZm9yZGhhbV92ZXJ5c2hhcnBzd29yZF8yMDA0OyBAY2FwcGVsbGF6aWVsaW5za2lfaG93c3RhdGVzcGF5XzIwMTY7IEBnaG9sel9tYW55bGluZXNkZWZlbnNlXzIwMjBdLiBPdGhlciBkb21lc3RpYyBpc3N1ZXMgbGlrZSBpbnRlci1icmFuY2ggcmVsYXRpb25zIFtAam9uZXNfcG9saXRpY3N3ZWFwb25zcHJvY3VyZW1lbnRfMjAxMV0sIHB1YmxpYyBvcGluaW9uIFtAc2F1bmRlcnNfd2FyaW5uZXJjaXJjbGVfMjAxNV0sIGFuZCBpbnRlcmVzdCBncm91cCBsb2JieWluZyBbQGhvbGxhbmRfZXhwbGFpbmluZ3dlYXBvbnNwcm9jdXJlbWVudF8xOTkzOyBAZG9tYnJvd3NraV9idXlpbmdtaWxpdGFyeXRyYW5zZm9ybWF0aW9uXzIwMDY7IEBnaG9sel9ob3dtaWxpdGFyeWlubm92YXRpb25fMjAxMV0gYWxsIHBvaW50IHRvIHRoZSBpbXBvcnRhbmNlIG9mIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGRyaXZlcnMgb2YgYSBzdGF0ZSdzIG1pbGl0YXJ5IHBvcnRmb2xpby4KCQpEZXNwaXRlIHRoZSBzaG9ydGNvbWluZ3Mgb2YgYWdncmVnYXRlIG1lYXN1cmVzIGZvciBleHBsYWluaW5nIGNvbmNlcHRzIG9mIGludGVyZXN0LCBtb3N0IGN1cnJlbnQgcmVzZWFyY2ggc3RpbGwgZm9jdXNlcyBvbiB2YXJpYXRpb24gaW4gdGhlIFx0ZXh0aXR7c2l6ZX0gb2Ygc3RhdGUgbWlsaXRhcmllcyBbQGF1ZnJhbnRfZnJhbmNlaXRzYWxsaWVzXzE5OTk7IEBmb3JkaGFtX2RvbWVzdGljcG9saXRpY3NpbnRlcm5hdGlvbmFsXzIwMDI7IEBzYW1wbGVfc29jaWV0YWxkZXRlcm1pbmFudHNpbXBhY3RfMjAxMzsgQGNhcHBlbGxhemllbGluc2tpX3doYXRnb2VzbXVzdF8yMDE3OyBAb2RlaG5hbF9lY29ub21pY3NlY3VyaXR5cG9saXRpY2FsXzIwMjBdLiBSZWNlbnQgd29yayB0aGF0IGRpc2FnZ3JlZ2F0ZXMgbWlsaXRhcnkgdGVjaG5vbG9neSBoYXMgaW52ZXN0aWdhdGVkIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbXBvcnRhbnQgY29uZmxpY3Qgb3V0Y29tZXMgYW5kIGNhcGFiaWxpdGllcyBsaWtlIG5hdmFsIHBsYXRmb3JtcyBbQGNyaXNoZXJfcG93ZXJzZWFuYXZhbF8yMDE0XSwgbWVjaGFuaXplZCBhcm1pZXMgW0BseWFsbF9yYWdlbWFjaGluZXNleHBsYWluaW5nXzIwMDk7IEBzZWNoc2VyX2FybXl5b3VoYXZlXzIwMTBdLCBhbmQgYWlyIHBvd2VyIFtAbWFydGluZXptYWNoYWluX2FpcmNhbXBhaWduZHVyYXRpb25fMjAxNTsgQGFsbGVuX3VuZGVyc3RhbmRpbmdpbXBhY3RhaXJfMjAxNzsgQGFsbGVuX2Nob29zaW5nYWlyc3RyaWtlc18yMDE4OyBAc2F1bmRlcnNfY29tbWFuZHNraWVzYWlycG93ZXJfMjAyMF0uIERlc3BpdGUgdGhlc2UgZGF0YSBiZWluZyBsaW1pdGVkIGluIHNjb3BlLCB0aGlzIGV4aXN0aW5nIHJlc2VhcmNoIGhpZ2hsaWdodGVkIHRoZSB2YWx1ZSBvZiBkaXNhZ2dyZWdhdGluZyBtaWxpdGFyeSBwb3dlciBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaW50ZXJuYXRpb25hbCBiYWxhbmNlIG9mIHBvd2VyLgoJCk5hdGlvbmFsIG1pbGl0YXJpZXMgYXJlIHByaW1hcmlseSBxdWFudGlmaWVkIGFuZCBjb21wYXJlZCBieSBtaWxpdGFyeSBzcGVuZGluZyBsZXZlbHMgb3IsIGluIHJhcmVyIGNhc2VzLCBtaWxpdGFyeSBwZXJzb25uZWwgY291bnRzLiBZZXQgZGF0YSBvbiBtaWxpdGFyeSBzcGVuZGluZyBwb3NlcyBrbm93biBwcm9ibGVtcyBhcyBhIG1ldHJpYyBmb3IgY3Jvc3MtbmF0aW9uYWwgYW5kIHRlbXBvcmFsIGNvbXBhcmlzb24gW0BwZXJsby1mcmVlbWFuX21vbml0b3JpbmdtaWxpdGFyeWV4cGVuZGl0dXJlXzIwMTddLiBTaW5jZSB0aGVyZSBhcmUgbm8gY29tbW9uIGRlZmluaXRpb25zIGFib3V0IHdoYXQgY29uc3RpdHV0ZXMgbWlsaXRhcnkgc3BlbmRpbmcsIHNvbWUgc3RhdGVzIG1lYXN1cmUgdGhpbmdzIGxpa2UgcGVuc2lvbiBhbmQgUlwmRCB3aGlsZSBvdGhlcnMgZG8gbm90IFtAYW1hcmFfdW5mdWxmaWxsZWRwcm9taXNlc2ltcGFjdF8yMDEwXS4gRXhjaGFuZ2UgcmF0ZXMgYXJlIG9mdGVuIHVzZWQgdG8gc3RhbmRhcmRpemUgYWxsIHNwZW5kaW5nIHRvIHRoZSBzYW1lIGN1cnJlbmN5LCBidXQgd2l0aCBpbGwtaW5mb3JtYXRpb24gYXBwbGljYXRpb25zIG9mIGRvbWVzdGljIHB1cmNoYXNpbmcgcG93ZXIgW0Bmb250YW5lbF9jb21wYXJpc29ubWlsaXRhcnlidWRnZXRzXzE5OTZdLiBGYWN0b3JzIGxpa2UgaW5mbGF0aW9uIGFuZCB2YXJ5aW5nIGJ1ZGdldCBjeWNsZXMgYXJlIGFsc28gZGlmZmljdWx0IHRvIGFjY291bnQgZm9yIGFuZCBkcmFtYXRpY2FsbHkgaW1wYWN0IGluZmVyZW5jZXMgZHJhd24gZnJvbSBkaWZmZXJlbnQgZGF0YSBzb3VyY2VzIFtAbGVib3ZpY191c2luZ21pbGl0YXJ5c3BlbmRpbmdfMTk5OV0uIFNvdXJjZXMgbGlrZSB0aGUgSU1GLCB0aGUgVU4gT2ZmaWNlIGZvciBEaXNhcm1hbWVudCBBZmZhaXJzLCB0aGUgVVMgQnVyZWF1IG9mIEFybXMgQ29udHJvbCwgVmVyaWZpY2F0aW9uLCBhbmQgQ29tcGxpYW5jZSwgdGhlIEludGVybmF0aW9uYWwgSW5zdGl0dXRlIGZvciBTdHJhdGVnaWMgU3R1ZGllcyAoSUlTUyksIGFuZCB0aGUgU3RvY2tob2xtIEludGVybmF0aW9uYWwgUGVhY2UgUmVzZWFyY2ggSW5zdGl0dXRlIChTSVBSSSkgYWxsIHByb2R1Y2UgYW5udWFsIG1pbGl0YXJ5IHNwZW5kaW5nIGVzdGltYXRlcyBidXQgdGhleSB1c2UgZGlmZmVyZW50IGVzdGltYXRpbmcgcHJvY2VkdXJlcywgcHJpbWFyeSBzb3VyY2VzLCBhbmQgcHJlcGFyYXRpb24gbWV0aG9kcyBbQGJyem9za2FfcmVwb3J0aW5nbWlsaXRhcnlleHBlbmRpdHVyZXNfMTk4MV0sIG1lYW5pbmcgdGhlb3JpZXMgc3VwcG9ydGVkIHVzaW5nIG9uZSBkYXRhIHNvdXJjZSB3aWxsIG9mdGVuIG5vdCBiZSBzdXBwb3J0ZWQgdXNpbmcgY29tcGFyYWJsZSBkYXRhIGZyb20gYW5vdGhlciBzb3VyY2UgW0Bib25pZmFjZV9hbm5lZXN0cmF0ZWdpcXVlMTk5NV8xOTk1XS4KCQpNaWxpdGFyeSBzcGVuZGluZyBkYXRhIGFsc28gaGFzIGEgdGVtcG9yYWwgYmlhcywgd2l0aCBlYXJsaWVyIHRpbWUgcGVyaW9kcyBleHBlcmllbmNpbmcgaGlnaGVyIHVuY2VydGFpbnR5LiBUaGlzIGhhcyBiZWVuIGV4dGVuc2l2ZWx5IGRvY3VtZW50ZWQgaW4gdGhlIGNhc2Ugb2YgV2VzdCBHZXJtYW55IG1pbGl0YXJ5IHNwZW5kaW5nIGR1cmluZyB0aGUgQ29sZCBXYXIsIHdoZXJlIGxhdGVyIHJlc2VhcmNoIGZvdW5kIHRoYXQgV2VzdCBHZXJtYW55J3MgaW50ZXJuYWwgZmlndXJlcyBkaWZmZXJlZCBmcm9tIHdoYXQgdGhleSB3ZXJlIHJlcG9ydGluZyB0byBOQVRPIFtAYnJ6b3NrYV9yZXBvcnRpbmdtaWxpdGFyeWV4cGVuZGl0dXJlc18xOTgxOyBAY293ZW5fZGVmZW5zZXByb2N1cmVtZW50ZmVkZXJhbF8xOTg2XS4gRXZlbiBjb21tb25seSB1c2VkIHNvdXJjZXMgbGlrZSBTSVBSSSBjYXV0aW9uIHJlc2VhcmNoZXJzIG9uIHVzaW5nIHRoZWlyIG1pbGl0YXJ5IHNwZW5kaW5nIGRhdGEgZm9yIGNyb3NzLW5hdGlvbmFsIGNvbXBhcmlzb25zLCBhcmd1aW5nIHRoYXQgaXQgaXMgaW5zdGVhZCBvbmx5IGFwcHJvcHJpYXRlIHRvIGNvbXBhcmUgYW55IG9uZSBjb3VudHJ5IG92ZXIgdGltZSBbQG9taXRvb2d1bl9taWxpdGFyeWV4cGVuZGl0dXJlZGF0YV8yMDA2XS4gRnVydGhlcm1vcmUsIG1pbGl0YXJ5IHNwZW5kaW5nIG1lYXN1cmVzIGRvbid0IGFjY291bnQgZm9yIHdoYXQgc3RhdGVzIHNwZW5kIHRoYXQgbW9uZXkgb24gYW5kIGhvdyB2YXJpYXRpb25zIGluIGZhY3RvcnMgbGlrZSBnZW9ncmFwaHkgY29tcGxpY2F0ZSBvdXIgYWJpbGl0eSB0byBjb21wYXJlIHRoZSBwcm9kdWN0aW9uIG9mIHNlY3VyaXR5IGFjcm9zcyBzdGF0ZXMuIFdoaWxlIHRoZXNlIHByb2JsZW1zIGxpa2VseSBleGlzdCB3aXRoIG1pbGl0YXJ5IGVxdWlwbWVudCBkYXRhIGFzIHdlbGwsIHNjaG9sYXJzIGhhdmUgbm90IGV2ZW4gYmVlbiBhYmxlIHRvIGlkZW50aWZ5IHRoZSBkZWdyZWUgb3IgZGlyZWN0aW9uIG9mIHRoaXMgYmlhcyBiZWNhdXNlIHRoZSBkYXRhIGRvZXMgbm90IHlldCBleGlzdC4KCQpNZWFzdXJlbWVudCBpc3N1ZXMgYXNpZGUsIGFsdGhvdWdoIHNjaG9sYXJzIGFuZCBwcmFjdGl0aW9uZXJzIGtub3cgdGhhdCBkZWZlbnNlIHNwZW5kaW5nIHZhcmllcyBhY3Jvc3Mgc3BhY2UgYW5kIHRpbWUsIGEgc2Vjb25kIGRpbWVuc2lvbiBvZiBpbXBvcnRhbnQgYW5kIHVuZGVyc3R1ZGllcyB2YXJpYXRpb24gaXMgdGhhdCBtaWxpdGFyaWVzIGFsc28gdmFyeSBpbiB0aGVpciBcdGV4dGl0e2NvbXBvc2l0aW9ufS5eW09mIGNvdXJzZSwgdGhlc2UgdHdvIGFyZSBub3Qgc3lub255bW91cy4gTWlsaXRhcnkgY2FwYWJpbGl0aWVzIGFyZSBvbmx5IG9uZSBjb21wb25lbnQgb2YgbWlsaXRhcnkgc3BlbmRpbmcgYW5kIHRoZSBjb3N0IG9mIGxhYm9yIGlzIGEgbGFyZ2UgY29tcG9uZW50IG9mIG1pbGl0YXJ5IHNwZW5kaW5nIFtAZm9yZGhhbV9kb21lc3RpY3BvbGl0aWNzaW50ZXJuYXRpb25hbF8yMDAyOyBAd2hpdHRlbl9idXR0ZXJ5Z3Vuc3dlbGZhcmVfMjAxMV0uXSBTY2hvbGFycyBoYXZlIG5vdGVkIGBgdGhlcmUgaXMgYSBsYWNrIG9mIGtub3dsZWRnZSBhYm91dCB2YXJpYXRpb24gYmV0d2VlbiBzdGF0ZXMgaW4gdGhlaXIgYmVoYXZpb3Igb24gYXJtYW1lbnRzIHBvbGljeSBkZWNpc2lvbnMiIFtAbWF3ZHNsZXlfYXJtYW1lbnRzZGVjaXNpb25tYWtpbmdhcmVfMjAxOF0gYmVjYXVzZSBvZiBwcm9ibGVtcyBlbXBpcmljYWxseSBpZGVudGlmeWluZyB0aGUgbWlsaXRhcnkgY2FwYWJpbGl0aWVzIHN0YXRlcyBwb3NzZXNzIFtAZm9yZGhhbV92ZXJ5c2hhcnBzd29yZF8yMDA0XS4gQnV0IGluIG9yZGVyIHRvIGlkZW50aWZ5IHRoZSBkcml2ZXJzIG9mIGFybWFtZW50IGRlY2lzaW9ucywgc2Nob2xhcnMgbXVzdCBrbm93IHdoYXQgYXJtYW1lbnQgZGVjaXNpb25zIGhhdmUgYmVlbiBtYWRlIFtAa3VydGhfd2h5d2VidXlfMTk3M10uIFVuZGVyc3RhbmRpbmcgZGlmZmVyZW5jZXMgaW4gdGhlIGNvbXBvc2l0aW9uIG9mIG1pbGl0YXJ5IGNhcGFiaWxpdGllcyBpcyB2aXRhbCB0byB1bmRlcnN0YW5kaW5nIG1pbGl0YXJ5IHBvd2VyIGJlY2F1c2UgdGhlc2UgY29tcG9uZW50cyBhcmUgbm90IGhvbW9nZW5lb3VzLiBUaGVzZSBjYXBhYmlsaXRpZXMgZGlmZmVyIGluIHdoYXQgdGhleSBjYW4gYWNjb21wbGlzaCBbQGxpbmRzYXlfcG9saXRpY3NtYW55b3RoZXJfMjAyMF0gYW5kIHRoZSBmYWN0IHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBpbiBob3cgZXZlbiBzaW1pbGFybHktc2l6ZWQgc3RhdGVzIGFybSB0aGVtc2VsdmVzIGlzIHByaW1hIGZhY2llIGV2aWRlbmNlIG9mIHRoZSBub24tZnVuZ2liaWxpdHkgb2YgbWF0ZXJpYWwgbWlsaXRhcnkgcG93ZXIuIE1pbGl0YXJ5IHNwZW5kaW5nIGl0c2VsZiBkb2VzIG5vdCBjcmVhdGUgbWlsaXRhcnkgcG93ZXI7IHJhdGhlciwgdGhhdCBtb25leSBtdXN0IGJlIHRyYW5zbGF0ZWQgaW50byBjYXBhYmlsaXRpZXMgdGhhdCBhbGxvdyBmb3IgdGhlIGV4ZXJjaXNlIG9mIHBvd2VyIHRocm91Z2ggYSB2YXJpZXR5IG9mIGRpc3RpbmN0IG1lYW5zLgoJCkFsdGhvdWdoIHNjaG9sYXJzIG9mIGludGVybmF0aW9uYWwgY29uZmxpY3QgaGF2ZSBwYWlkIGNvbXBhcmF0aXZlbHkgbGl0dGxlIGF0dGVudGlvbiB0byBpZGVudGlmeWluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIG1pbGl0YXJ5IGNhcGFiaWxpdGllcywgdGhlIHNhbWUgaXMgaGFyZGx5IHRydWUgZm9yIHByYWN0aXRpb25lcnMuIER1cmluZyB0aGUgQ29sZCBXYXIsIEJyaXRpc2ggZGlwbG9tYXQgSmFtZXMgQGNhYmxlX2d1bmJvYXRkaXBsb21hY3lwb2xpdGljYWxfMTk3MFsxMjddIGRlc2NyaWJlZCB0aGUgVVMgYXMgInRoZSBvbmx5IG5hdnkgd2l0aCB0aGUgc2hlZXIgbnVtYmVyIG9mIHNoaXBzLCB3aXRoIGVub3VnaCBhaXJjcmFmdCBjYXJyaWVycywgb2NlYW4tZ29pbmcgc3VyZmFjZSB3YXJzaGlwcywgYW1waGliaW91cyBjcmFmdCBhbmQgc3VwcGx5IHZlc3NlbHMsIHRvIHVuZGVydGFrZSBldmVyeSBjbGFzcyBvZiBvcGVyYXRpb24sIGluIGFueSBwYXJ0IG9mIHRoZSBvY2VhbnMgYW5kIGZvciBhcyBtdWNoIG9mIHRoZSBmdXR1cmUgYXMgY2FuIHlldCBiZSBmb3Jlc2Vlbi4iIFRoaXMgaXMgdGhlIHBvbGl0aWNhbCBkaW1lbnNpb24gb2YgZm9yY2Ugc3RydWN0dXJlIGRlY2lzaW9ucyAtLSB3aGF0IGEgc3RhdGVzIHByb2R1Y2VzIGFuZCBvbWl0cyBpbiBpdHMgZGVmZW5zZSBwb3J0Zm9saW8gcmVmbGVjdHMgaXRzIHBvbGl0aWNhbCBwcmlvcml0aWVzIGluIHdheXMgdGhhdCBlY29ub21pYyBjb25zaWRlcmF0aW9ucyBhbG9uZSBjYW5ub3QgZXhwbGFpbiBbQGhvbmVfZm9yY2VwbGFubmluZ2N5Y2xlc18xOTkzOyBAY2F2ZXJsZXlfdW5pdGVkc3RhdGVzaGVnZW1vbnlfMjAwN10uIEFzIHRoZW4tU2VuYXRvciBKb3NlcGggQGJpZGVuX2JpZGVucmVtYXJrc21jY2Fpbl8yMDA4IHJlbWFya2VkIHJlZ2FyZGluZyBkb21lc3RpYyBlY29ub21pYyBwb2xpY3kgZHVyaW5nIGhpcyB2aWNlIHByZXNpZGVudGlhbCBjYW1wYWlnbiwgIltkXW9u4oCZdCB0ZWxsIG1lIHdoYXQgeW91IHZhbHVlLiBTaG93IG1lIHlvdXIgYnVkZ2V0LCBhbmQgSeKAmWxsIHRlbGwgeW91IHdoYXQgeW91IHZhbHVlLiIgVGhpcyBhbHNvIGhvbGRzIHRydWUgaW4gdGhlIG1pbGl0YXJ5IGNvbnRleHQsIHdoZXJlIGRpc2Nvbm5lY3RzIGNvbmNlcm5pbmcgYSBzdGF0ZSdzIGJ1ZGdldCBhbmQgYWxsZWdlZCBwcmlvcml0aWVzIGFyZSBtaXNzZWQgYnkgbG9va2luZyBhdCB0b3AtbGluZSBzcGVuZGluZyBmaWd1cmVzLiBEZXNwaXRlIGRlY2FkZXMgb2YgY29uY2VybiBhYm91dCBhIENoaW5lc2UgaW52YXNpb24gb2YgVGFpd2FuLCBpdCB3YXMgbm90IHVudGlsIDIwMTcgdGhhdCBDaGluYSBiZWdhbiBpbnZlc3RpbmcgaW4gdGhlIGFtcGhpYmlvdXMgYXNzYXVsdCBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IGZvciB0aGF0IHRocmVhdCB0byBhY3R1YWxseSBiZSBjYXJyaWVkIG91dCBbQG9mZmljZW9mdGhlc2VjcmV0YXJ5b2ZkZWZlbnNlX21pbGl0YXJ5c2VjdXJpdHlkZXZlbG9wbWVudHNfMjAxOCwgOTUtOTldLgoJCiMgVGhlIHJETUMgRGF0YXNldDogU2NvcGUgYW5kIERhdGEgR2VuZXJhdGluZyBQcm9jZXNzClRoaXMgcGFwZXIgaW50cm9kdWNlcyB0aGUgZmlyc3QgY29tcHJlaGVuc2l2ZSBkYXRhc2V0IG9mIGRpc2FnZ3JlZ2F0ZWQgbWlsaXRhcnkgY2FwYWJpbGl0aWVzLiBEYXRhIG9uIG1pbGl0YXJ5IHRlY2hub2xvZ3kgcG9ydGZvbGlvcyBpcyBwcm9kdWNlZCBieSB0aGUgSW50ZXJuYXRpb25hbCBJbnN0aXR1dGUgZm9yIFN0cmF0ZWdpYyBTdHVkaWVzIChJSVNTKSBpbiB0aGUgYW5udWFsIE1pbGl0YXJ5IEJhbGFuY2UgcmVwb3J0cy4gRGlmZmVyZW50IHBvcnRpb25zIG9mIHRoZXNlIHJlcG9ydHMgaGF2ZSBiZWVuIHVzZWQgZnJlcXVlbnRseSBpbiBhY2FkZW1pYyBwdWJsaWNhdGlvbnMuIE1vc3Qgb2YgdGhpcyB3b3JrIGhhcyB1c2VkIElJU1MgZGF0YSBvbiBtaWxpdGFyeSBzcGVuZGluZyBbQGdvbGRzdGVpbl9ncmVhdGV4cGVjdGF0aW9uc2ludGVycHJldGluZ18xOTk4OyBAd29obGZvcnRoX3N0YWJpbGl0eXVuaXBvbGFyd29ybGRfMTk5OTsgQGhhbGxlcmJlcmdfZXhlY3V0aXZlYXV0aG9yaXR5cGVyc29uYWxfMjAwNDsgQGdyZWVuaGlsbF9wZXJpbHNwcm9maWxpbmdjaXZpbF8yMDA3XSBvciBwZXJzb25uZWwgW0BsaWViZXJfd2FpdGluZ2JhbGFuY2luZ3doeV8yMDA1OyBAc3VuZHN0cm9tX2ZvcmVpZ25hc3Npc3RhbmNlaW50ZXJuYXRpb25hbF8yMDA1OyBAd2FsdGVyX2J1aWxkaW5ncmVwdXRhdGlvbndoeV8yMDA2OyBAc3RhbnRvbl90ZXJyb3Jpc21jb250ZXh0Y2l2aWxfMjAxMzsgQGdhaWJ1bGxvZXZfcGVyc29ubmVsY29udHJpYnV0aW9uc25vbnVuXzIwMTVdLiBUaGUgbGl0dGxlIHdvcmsgdGhhdCBoYXMgbG9va2VkIGF0IElJU1MgZGF0YSBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIG1pbGl0YXJ5IGNhcGFiaWxpdGllcyBoYXMgZm9jdXNlZCBvbiBhIG5hcnJvdyBsaXN0IG9mIHBsYXRmb3JtcyBsaWtlIG1lY2hhbml6ZWQgdmVoaWNsZXMgW0BseWFsbF9yYWdlbWFjaGluZXNleHBsYWluaW5nXzIwMDk7IEBzZWNoc2VyX2FybXl5b3VoYXZlXzIwMTBdLCBzdHJhdGVnaWMgbGlmdCBhaXJjcmFmdCBbQGt1cGNoYW5fbmF0b3BlcnNpYW5ndWxmXzE5ODhdLCBhbmQgZmlnaHRlciBqZXRzIFtAc2F1bmRlcnNfY29tbWFuZHNraWVzYWlycG93ZXJfMjAyMF0gb3IgYSBzaG9ydCBsaXN0IG9mIGNvdW50cmllcyBsaWtlIGdyZWF0IHBvd2VycyBbQGJyb29rc19yaXNlZmFsbGdyZWF0XzIwMTZdIG9yIENoaW5hIGFuZCBpdHMgcml2YWxzIFtAYmVja2xleV9lbWVyZ2luZ21pbGl0YXJ5YmFsYW5jZV8yMDE3XS4gVGhlIHByaW1hcnkgcmVhc29uIGZvciB0aGlzIHJlbGF0aXZlbHkgbGltaXRlZCB1c2Ugb2YgZmluZS1ncmFpbmVkIGhpZ2gtcXVhbGl0eSBkYXRhIGlzIGRpZmZpY3VsdHkgaW4gY29udmVydGluZyB0aGUgZGF0YSB0byBhbiBlYXNpbHktdXNhYmxlIGZvcm1hdCBhbmQgc3RhbmRhcmRpemluZyBpdCBhY3Jvc3MgY291bnRyaWVzIGFuZCB5ZWFycy4KClRoZSBkYXRhIHJlcHJlc2VudCBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgZm9yIGByIHNjYWxlczo6Y29tbWEoZHBseXI6Om5fZGlzdGluY3QocmRtY19yYXckY291bnRyeSkpYCBjb3VudHJpZXMgb3ZlciBhbG1vc3QgaGFsZiBhIGNlbnR1cnkgKDE5NzAgLS0gMjAxNCkuIEFsdGhvdWdoIHRoZSBNaWxpdGFyeSBCYWxhbmNlIHdhcyBmaXJzdCBwdWJsaXNoZWQgaW4gMTk2MSwgcHJpb3IgdG8gMTk3MCB0aGUgcmVwb3J0IGZvY3VzZWQgb24gTkFUTyBhbmQgV2Fyc2F3IFBhY3Qgc3RhdGVzIG9ubHksIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBhYm91dCB0aGUgZm9ybWVyIHRoYW4gdGhlIGxhdHRlciBbQG5lbHNvbl9lbXBpcmljYWxlc3RpbWF0ZXNyZWxpYWJpbGl0eV8xOTg1OyBAYm9obWVsdF9pbXBhY3RpbnN0aXR1dGlvbmFsY291cHByb29maW5nXzIwMTVdLiBVc2luZyAxOTcwIGFzIHRoZSBjdXQgb2ZmLCBGaWd1cmUgXHJlZntmaWc6bWlzc2luZ25lc3N9IHNob3dzIHdoYXQgcGVyY2VudCBvZiB5ZWFycyBhcmUgY29kZWQgZm9yIGVhY2ggY291bnRyeS5eW0kgdXNlIHBlcmNlbnQgb2YgeWVhcnMgc2luY2Ugbm90IGFsbCBjb3VudHJpZXMgZXhpc3QgYWNyb3NzIHRoZSBlbnRpcmUgZHVyYXRpb24gb2YgdGhlIGRhdGEuIDEwMFwlIG9mIFNsb3ZlbmlhIGlzIGNvdmVyZWQsIGZvciBleGFtcGxlLCBiZWNhdXNlIGRhdGEgZXhpc3RzIGZvciBhbGwgMjIgeWVhcnMgc2luY2Ugc2luY2UgaXQgZXN0YWJsaXNoZWQgaW5kZXBlbmRlbmNlIGluIDE5OTEuXSA1NFwlIG9mIGNvdW50cmllcyBoYXZlIG5vIG1pc3NpbmcgZGF0YSBhY3Jvc3MgdGhlIGVudGlyZSB0aW1lIHNwYW4sIHdpdGggdGhlIG1lZGlhbiBjb3VudHJ5IGhhdmluZyBkYXRhIGF2YWlsYWJsZSBmb3IgOTVcJSBvZiBpdHMgeWVhcnMgYW5kIHRoZSBtZWFuIGNvdW50cnkgaGF2aW5nIDg4XCUgY292ZXJhZ2UuCgpgYGB7ciBtaXNzaW5nbmVzcywgZmlnLmNhcD0iQ292ZXJhZ2Ugb2YgYXZhaWxhYmxlIGRhdGEgb24gc3RhdGUgbWlsaXRhcnkgY2FwYWJpbGl0aWVzICgxOTcwIC0tIDIwMTQpIiwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9My41fQpzdGF0ZXMgPC0gcmVhZC5jc3YoZmlsZSA9IHBhc3RlMChoZXJlOjpoZXJlKCksICcvaW5zdC9leHRkYXRhL3BvbGl0aWVzX21zc2xfZ2xlZGl0c2Nod2FyZF9zdGF0ZXMuY3N2JykpICU+JQogIGRwbHlyOjpmaWx0ZXIobWljcm9zdGF0ZSA9PSAwKSAlPiUKICBkcGx5cjo6c2VsZWN0KGd3Y29kZSwgZ3dfc3RhcnQsIGd3X2VuZCkKCiMgTWFrZSBsb25nIHRvIGV4cGFuZCB5ZWFyIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIG1hdGNoIG9uIHRoZSBxY29kZS15ZWFyIGNvbWJvCnN0YXRlcyRnd19zdGFydCA8LSBhcy5QT1NJWGN0KHN0YXRlcyRnd19zdGFydCkKc3RhdGVzJGd3X2VuZCA8LSBhcy5QT1NJWGN0KHN0YXRlcyRnd19lbmQpCgpzdGF0ZXMkZ3dfc3RhcnQgPC0gYXMubnVtZXJpYyhmb3JtYXQoc3RhdGVzJGd3X3N0YXJ0LCAnJVknKSkKc3RhdGVzJGd3X2VuZCA8LSBhcy5udW1lcmljKGZvcm1hdChzdGF0ZXMkZ3dfZW5kLCAnJVknKSkKCiMgTWFrZSBsaXN0IG9mIHllYXJzIGluIGV4aXN0ZW5jZSBmcm9tIDE5NzAtMjAxNCBmcm9tIEdXCnN0YXRlcyA8LSBzdGF0ZXMgJT4lCiAgZHBseXI6OmZpbHRlcihnd19lbmQgPj0gMTk3MCkgJT4lCiAgZHBseXI6Om11dGF0ZShzdGFydCA9IGRwbHlyOjppZl9lbHNlKGd3X3N0YXJ0IDw9IDE5NzAsIDE5NzAsIGd3X3N0YXJ0KSwKICAgICAgICAgICAgICAgIGVuZCA9IGRwbHlyOjppZl9lbHNlKGd3X2VuZCA8IDIwMTIsIGd3X2VuZCwgMjAxNCksCiAgICAgICAgICAgICAgICB5ZWFycyA9IGVuZCAtIHN0YXJ0KSAlPiUKICBkcGx5cjo6c2VsZWN0KGd3Y29kZSwgeWVhcnMpCgojIE1ha2UgbGlzdCBvZiB5ZWFycyBjb2RlZCBmcm9tIDE5NzAtMjAxNCBmcm9tIHJETUMKbWFwIDwtIHJkbWNfcmF3ICU+JQogIGRwbHlyOjpmaWx0ZXIoeWVhciA+PSAxOTcwICYKICAgICAgICAgICAgICAgICAgeWVhciA8PSAyMDE0KSAlPiUKICBkcGx5cjo6c2VsZWN0KHllYXIsIGNjb2RlKSAlPiUKICBkcGx5cjo6cmVuYW1lKGd3Y29kZSA9IGNjb2RlKSAlPiUKICBkcGx5cjo6bXV0YXRlKGNvZGVkID0gMSwKICAgICAgICAgICAgICAgIGd3Y29kZSA9IGFzLm51bWVyaWMoZ3djb2RlKSkgJT4lCiAgZHBseXI6OmRpc3RpbmN0KCkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGd3Y29kZSkgJT4lCiAgZHBseXI6Om11dGF0ZShjb3ZlcmFnZSA9IHN1bShjb2RlZCkgLSAxKSAlPiUKICBkcGx5cjo6bXV0YXRlKGNvdmVyYWdlID0gZHBseXI6OmlmX2Vsc2UoaXMubmEoY292ZXJhZ2UpLCAwLCBjb3ZlcmFnZSkpICU+JQogIGRwbHlyOjpzZWxlY3QoZ3djb2RlLCBjb3ZlcmFnZSkgJT4lCiAgZHBseXI6OmRpc3RpbmN0KCkKCmNvZGVkIDwtIGRwbHlyOjpsZWZ0X2pvaW4oc3RhdGVzLCBtYXApICU+JQogIGRwbHlyOjptdXRhdGUoY29kZWQgPSByb3VuZChjb3ZlcmFnZS95ZWFycywgMikpICU+JQogIGRwbHlyOjptdXRhdGUoY29kZWQgPSBkcGx5cjo6aWZfZWxzZShjb2RlZCA+IDEsIDEsIGNvZGVkKSkKCmNvZGVkJGNuYW1lIDwtIGNvdW50cnljb2RlOjpjb3VudHJ5Y29kZShjb2RlZCRnd2NvZGUsICJjb3duIiwgImNvd2MiKQpjb2RlZCRuYW1lIDwtIGNvdW50cnljb2RlOjpjb3VudHJ5Y29kZShjb2RlZCRnd2NvZGUsICJjb3duIiwgImNvdW50cnkubmFtZSIpCgojIEZpeCBzb21lIGNvdW50cnkgbmFtZXMgbWFudWFsbHkKY29kZWQkbmFtZVtjb2RlZCRuYW1lID09ICJVbml0ZWQgU3RhdGVzIl0gPC0gIlVTQSIKY29kZWQkbmFtZVtjb2RlZCRuYW1lID09ICJVbml0ZWQgS2luZ2RvbSJdIDwtICJVSyIKY29kZWQkbmFtZVtjb2RlZCRuYW1lID09ICJHZXJtYW4gRGVtb2NyYXRpYyBSZXB1YmxpYyJdIDwtICJHZXJtYW55Igpjb2RlZCRuYW1lW2NvZGVkJG5hbWUgPT0gIkNvbmdvIC0gS2luc2hhc2EiXSA8LSAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iCmNvZGVkJG5hbWVbY29kZWQkbmFtZSA9PSAiQ29uZ28gLSBCcmF6emF2aWxsZSJdIDwtICJSZXB1YmxpYyBvZiBDb25nbyIKY29kZWQkbmFtZVtjb2RlZCRuYW1lID09ICJDemVjaGlhIl0gPC0gIkN6ZWNoIFJlcHVibGljIgoKY29kZWQgPC0gY29kZWQgJT4lCiAgZHBseXI6Om11dGF0ZShjYXRlZ29yeSA9IGRwbHlyOjpjYXNlX3doZW4oY29kZWQgPiAwICYgY29kZWQgPCAwLjc1IH4gIjEtNzQlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCA+PSAwLjc1ICYgY29kZWQgPCAwLjkgfiAiNzUtODklIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCA+PSAwLjkwICYgY29kZWQgPCAxIH4gIjkwLTk5JSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWQgPT0gMSB+ICIxMDAlIikpCgpjb2RlZCRjYXRlZ29yeSA8LSBhcy5mYWN0b3IoY29kZWQkY2F0ZWdvcnkpCgpjb2RlZCRjYXRlZ29yeSA8LSBmYWN0b3IoY29kZWQkY2F0ZWdvcnksIGxldmVscyA9IGMoIjEtNzQlIiwgIjc1LTg5JSIsICI5MC05OSUiLCAiMTAwJSIpKQogIAojIyBNYWtlIG1hcApXb3JsZERhdGEgPC0gbWFwX2RhdGEoJ3dvcmxkJykKCnRoZW1lX21hcCA8LSBmdW5jdGlvbihiYXNlX3NpemUgPSA5LCBiYXNlX2ZhbWlseSA9ICIiKSB7CiAgdGhlbWVfYncoYmFzZV9zaXplID0gYmFzZV9zaXplLCBiYXNlX2ZhbWlseSA9IGJhc2VfZmFtaWx5KSAlK3JlcGxhY2UlCiAgICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGFuZWwuc3BhY2luZyA9IHVuaXQoMCwgImxpbmVzIiksCiAgICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMCkjLAogICAgICAgICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMSwxKQogICAgICAgICAgKQp9CgpnZ3Bsb3QoKSArCiAgZ2VvbV9tYXAoZGF0YSA9IFdvcmxkRGF0YSwKICAgICAgICAgICBtYXAgPSBXb3JsZERhdGEsCiAgICAgICAgICAgYWVzKGdyb3VwID0gZ3JvdXAsCiAgICAgICAgICAgICAgIG1hcF9pZCA9IHJlZ2lvbiksCiAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIsCiAgICAgICAgICAgc2l6ZSA9IDAuMzUpICsKICBnZW9tX21hcChkYXRhID0gY29kZWQsCiAgICAgICAgICAgbWFwID0gV29ybGREYXRhLAogICAgICAgICAgIGFlcyhmaWxsID0gY2F0ZWdvcnksCiAgICAgICAgICAgICAgIG1hcF9pZCA9IG5hbWUpKSArCiAgYm9yZGVycygid29ybGQiLAogICAgICAgICAgc2l6ZSA9IDAuMjUsCiAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIodHlwZSA9ICJkaXYiLAogICAgICAgICAgICAgICAgICAgIGd1aWRlID0gImxlZ2VuZCIpICsKICB0aGVtZV9tYXAoKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC01MCwgOTApKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50IG9mIHllYXJzIGNvZGVkIGZvciBlYWNoIGNvdW50cnkiLAogICAgICAgZmlsbCA9ICJQZXJjZW50IikKYGBgCgpUaGUgbWlsaXRhcnkgY2FwYWJpbGl0aWVzIGFyZSBvcmdhbml6ZWQgaGllcmFyY2hpY2FsbHksIHdpdGggaGlnaGVyIGxldmVscyBvZiBvcmdhbml6YXRpb24gcmVwcmVzZW50aW5nIGJyb2FkIGNhdGVnb3JpZXMgbGlrZSBoZWxpY29wdGVycyBvciBwcmluY2lwYWwgc3VyZmFjZSBjb21iYXRhbnRzIGFuZCBsb3dlciBsZXZlbHMgb2Ygb3JnYW5pemF0aW9uIHJlcHJlc2VudGluZyBkaXN0aW5jdCByb2xlcyB3aXRoaW4gdGhvc2UgY2F0ZWdvcmllcyBsaWtlIGF0dGFjayBoZWxpY29wdGVycyB2ZXJzdXMgdHJhbnNwb3J0IGhlbGljb3B0ZXJzIG9yIGFpcmNyYWZ0IGNhcnJpZXJzIHZlcnN1cyBkZXN0cm95ZXJzLiBUaGUgckRNQyBjb2RlYm9vayBhY2NvbXBhbnlpbmcgdGhpcyBwYXBlciBhbmQgZGF0YXNldCBkZXNjcmliZXMgdGhlIHRlbXBvcmFsIGFuZCBzcGF0aWFsIHNjb3BlIG9mIHRoZSBkYXRhIGFzIHdlbGwgYXMgdGhlIG1pbGl0YXJ5IGNhcGFiaWxpdGllcyB0aGF0IGFyZSBpbmNsdWRlZC4KCkFzIHdpdGggbXVjaCBkYXRhIGluIGludGVybmF0aW9uYWwgYWZmYWlycywgY29uY2VybnMgYWJvdXQgZGF0YSBxdWFsaXR5IGFuZCBhY2N1cmFjeSByZW1haW4gc2FsaWVudC4gVGhlIGV4dGVuc2l2ZSB1c2Ugb2YgdGhlIElJU1MgTWlsaXRhcnkgQmFsYW5jZSByZXBvcnRzIGJ5IG90aGVyIHNjaG9sYXJzIGdpdmVzIHNvbWUgY29uZmlkZW5jZSBpbiBpdHMgYWNjdXJhY3kgYW5kIGFsc28gYWxsb3dzIGZvciB0aGUgZGF0YSBjb2RpbmdzIGhlcmUgdG8gYmUgZG91YmxlLWNoZWNrZWQgd2l0aCBkYXRhIGNvZGluZ3MgYnkgb3RoZXIgc2Nob2xhcnMgdG8gY29ycmVjdCBkYXRhIGVudHJ5IGFuZCBjb2RpbmcgZXJyb3JzLiBBbiBleHRlbnNpdmUsIGJ1dCBub3QgZXhoYXVzdGl2ZSBsaXN0IG9mIHRob3NlIHB1YmxpY2F0aW9ucyBpcyBwcm92aWRlZCBpbiB0aGUgYXBwZW5kaXguIEEgbGlzdCBvZiB0aGUgbW9zdCBjb21wcmVoZW5zaXZlIHVzZXMgb2YgSUlTUyBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgZGF0YSBpcyBwcm92aWRlZCBpbiBUYWJsZSBccmVme3RhYmxlOmlpc3NfbGl0cmV2aWV3fS4KCiAgXGJlZ2lue3NpbmdsZXNwYWNlfQoJXGJlZ2lue3RhYmxlfVtoXQoJICBcY2VudGVyaW5nCgkgIFxjYXB0aW9uW1ByaW9yIHVzZSBvZiBJSVNTIGRhdGFde1NhbXBsZSBvZiB0aGUgMTAgbW9zdCBjb21wcmVoZW5zaXZlIHVzZXMgb2YgSUlTUyBtaWxpdGFyeSBlcXVpcG1lbnQgZGF0YSBpbiBtYWpvciBwb2xpdGljYWwgc2NpZW5jZSBwdWJsaWNhdGlvbnMgKGxpc3RlZCBjaHJvbm9sb2dpY2FsbHkpLiBBIGZ1bGwgbGlzdCBvZiBhbGwgMjAgZG9jdW1lbnRlZCBwdWJsaWNhdGlvbnMsIGluY2x1ZGluZyB0aGUgbGlzdCBvZiBjb3VudHJpZXMgYW5kIHllYXJzIHVzZWQsIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBhdXRob3IufQoJICBcYmVnaW57dGFidWxhcn17fHB7NS41Y219fGN8Y3xwezZjbX18fQoJCQlcaGxpbmUgCgkJCVx0ZXh0YmZ7UHVibGljYXRpb259ICYgXHRleHRiZntZZWFyc30gJiBcdGV4dGJme0NvdW50cmllc30gJiBcdGV4dGJme1RlY2hub2xvZ2llc30gXFwgCgkJCVxobGluZSAKCQkJSGFlc2Vicm91Y2sgKDIwMTgpICYgMSAmIDQzICYgQ29tYmF0IGFpcmNyYWZ0IFxcIAoJCQlcaGxpbmUgCgkJCUJlY2tsZXkgKDIwMTcpICYgMjAgJiA5ICYgU3VibWFyaW5lcywgc3VyZmFjZSBzaGlwcywgNHRoIGdlbmVyYXRpb24gZmlnaHRlciBhaXJjcmFmdCBcXCAKCQkJXGhsaW5lIAoJCQlLYW5nICgyMDE3KSAmIDEgJiAzMiAmIE5hdmFsIHZlc3NlbHMgXFwgCgkJCVxobGluZSAKCQkJQnJvb2tzICgyMDE2KSAmIDEgJiA2ICYgU3VibWFyaW5lcywgYWlyY3JhZnQgY2FycmllciwgY29tYmF0IHNoaXBzLCBVQVZzLCB0YWN0aWNhbCBhaXJjcmFmdCwgc2F0ZWxsaXRlcywgYWlyY3JhZnQsIGhlbGljb3B0ZXJzIFxcIAoJCQlcaGxpbmUgCgkJCVNhbmRsZXIgKDIwMTQpICYgMSAmIDMxICYgQ29tYmF0IGFpcmNyYWZ0IFxcIAoJCQlcaGxpbmUgCgkJCVNlY2hzZXIgKDIwMTApICYgMTEgJiAxNTAgJiBBcm1vcmVkIHZlaGljbGVzIFxcCgkJCVxobGluZQoJCQlMeWFsbCAoMjAwOSkgJiAxICYgMTY3ICYgTWVjaGFuaXplZCB2ZWhpY2xlcyBcXCAKCQkJXGhsaW5lCgkJCUF1ZXJzd2FsZCAoMjAwNCkgJiAxICYgNSAmIEFpcmNyYWZ0IFxcIAoJCQlcaGxpbmUgCgkJCVBvc2VuICgyMDAzKSAmIDIgJiAxICYgU2hpcHMgYW5kIGFpcmNyYWZ0IFxcIAoJCQlcaGxpbmUgCgkJCUt1cGNoYW4gKDE5OTgpICYgNiAmIDUgJiBTdHJhdGVnaWMgbGlmdCBhaXJjcmFmdCBcXCAKCQkJXGhsaW5lIAoJCVxlbmR7dGFidWxhcn0gCgkJXGxhYmVse3RhYmxlOmlpc3NfbGl0cmV2aWV3fQoJXGVuZHt0YWJsZX0KCVxlbmR7c2luZ2xlc3BhY2V9CgkKUG9saWN5bWFrZXJzIHNpbWlsYXJseSByZWx5IG9uIHRoZSBJSVNTIE1pbGl0YXJ5IEJhbGFuY2UgcmVwb3J0cywgd2l0aCBmb3JtZXIgVVMgQXJteSBHZW5lcmFsIFBldHJhZXVzIGRlc2NyaWJpbmcgaXQgYXMgInRoZSBnby10byBzb3VyY2Ugb2YgdW5jbGFzc2lmaWVkLCBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiBvbiBkZWZlbnNlIGNhcGFiaWxpdGllcyBhcm91bmQgdGhlIHdvcmxkIiwgZm9ybWVyIFVTIFNlY3JldGFyeSBvZiBEZWZlbnNlIFJvYmVydCBHYXRlcyBub3RpbmcgdGhhdCBpdCAicHJvdmlkZXMgZXNzZW50aWFsIGZhY3RzIGFuZCBhbmFseXNpcyBmb3IgZGVjaXNpb24tbWFrZXJzIGFuZCBmb3IgYmV0dGVyIGluZm9ybWVkIHB1YmxpYyBkZWJhdGUiLCBhbmQgZm9ybWVyIFVTIFNlY3JldGFyeSBvZiBEZWZlbnNlIExlb24gUGFuZXR0YSByZW1hcmtpbmcgdGhhdCBpdCBpcyAid2lkZWx5IHJlY29nbmlzZWQgYXMgdGhlIGJlc3QgdW5jbGFzc2lmaWVkIHNvdXJjZSBvZiBkZWZlbnNlIGluZm9ybWF0aW9uIG9uIHBlcnNvbm5lbCwgZXF1aXBtZW50IGFuZCBidWRnZXRzIGZvciBldmVyeSBjb3VudHJ5LiIgRXZlbiBpZiB0aGUgZGF0YSBkb2VzIG5vdCBwZXJmZWN0bHkgcmVwcmVzZW50IHN0YXRlIG1pbGl0YXJ5IGNhcGFjaXRpZXMsIGl0IGluZmx1ZW5jZXMgaG93IHBvbGljeW1ha2VycyBiZWhhdmUgc2luY2UgdGhleSB1c2UgdGhlIGRhdGEgZm9yIHRoZWlyIGFuYWx5c2lzLiBUaGUgZm9ybWVyIFN1cHJlbWUgQWxsaWVkIENvbW1hbmRlciBvZiBOQVRPLCBBZG1pcmFsIEphbWVzIFN0YXZyaWRpcywgc2FpZCBgYHRocm91Z2hvdXQgbXkgY2FyZWVyLCBJIGhhdmUgcmVsaWVkIGV4dGVuc2l2ZWx5IG9uIFRoZSBNaWxpdGFyeSBCYWxhbmNlIHByb2R1Y2VkIHNvIGV4cGVydGx5IGJ5IHRoZSBJSVNTLiBJdCBpcyB0aGUgImdvIHRvIiBzb3VyY2UgZm9yIHNlcmlvdXMgYW5hbHlzdHMgYW5kIHdhcnJpb3JzIGZhY2luZyByZWFsIHdvcmxkIGNoYWxsZW5nZXMuIl5bUXVvdGVzIGNvbWUgZnJvbSBbSUlTUyBUZXN0aW1vbmlhbHNdKGh0dHBzOi8vd3d3Lmlpc3Mub3JnL3B1YmxpY2F0aW9ucy90aGUtbWlsaXRhcnktYmFsYW5jZSldCgkKVGhlIGFjY3VyYWN5IG9mIHRoZSBkYXRhIGNhbiBhbHNvIGJlIGRvdWJsZSBjaGVja2VkIGluIGNlcnRhaW4gaW5zdGFuY2VzIHVzaW5nIHJlbGlhYmxlIHByaW1hcnkgc291cmNlIGRhdGEgZnJvbSBnb3Zlcm5tZW50IHJlcG9ydHMuIE5ldyBaZWFsYW5kLCBmb3IgZXhhbXBsZSwgcHVibGlzaGVzIGFubnVhbCByZXBvcnRzIG9uIHRoZSBtaWxpdGFyeSdzIHBlcmZvcm1hbmNlIHRhcmdldHMgdGhhdCBkZXNjcmliZSB0aGUgcmVzb3VyY2VzIGF0IHRoZSBtaWxpdGFyeSdzIGRpc3Bvc2FsIFtAYWxleGFuZGVyX2NvdW50cnlzdXJ2ZXl4dmlpXzIwMDJdLiBBbHRob3VnaCBzdWNoIGRhdGEgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsIGNvdW50cmllcyBub3IgZm9yIGFsbCB5ZWFycywgY2hlY2tpbmcgdGhlIGRhdGEgaW4gc3VjaCBhIG1hbm5lciB3aGVyZSBwb3NzaWJsZSBzaG91bGQgcHJvdmlkZSBmYWNlIHZhbGlkaXR5IGFib3V0IHRoZSBhY2N1cmFjeSBvZiB0aGUgSUlTUyBtZWFzdXJlcy4KCiMgRGF0YSBDb2xsZWN0aW9uIGFuZCBGb3JtYXRzClRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyBmaXJzdCBpbnZvbHZlZCBjcmVhdGluZyBhIGNvbnNpc3RlbnQgdHlwb2xvZ3kgb2YgbWlsaXRhcnkgZXF1aXBtZW50IHR5cGVzLCBlcXVpcG1lbnQgbmFtZXMsIGFuZCB1bml0IG5hbWVzLiBJIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIGRhdGEuIFRoZSBmaXJzdCwgXHRleHRpdHtyRE1DIHJhd30sIG9yZ2FuaXplcyBtaWxpdGFyeSBlcXVpcG1lbnQgdHJ1ZSB0byB0aGUgb3JpZ2luYWwgSUlTUyBjYXRlZ29yaXphdGlvbnMuIFRoZSBzZWNvbmQgYW5kIHRoaXJkLCBcdGV4dGl0e3JETUMgbG9uZ30gYW5kIFx0ZXh0aXR7ckRNQyB3aWRlfSBwcm9kdWNlIGEgbmV3IG1vcmUgYWdncmVnYXRlZCBjbGFzc2lmaWNhdGlvbiBvZiBtaWxpdGFyeSBjYXBhYmlsaXRpZXMuIFRhYmxlIFxyZWZ7dGFibGU6Y2F0ZWdvcmllc30gc2hvd3MgdGhlIHVuaXF1ZSB2YWx1ZXMgdGhhdCBleGlzdCBhdCBlYWNoIG5lc3RlZCBsZXZlbCBpbiB0aGUgY2F0ZWdvcml6YXRpb24gc2NoZW1lIHByb3ZpZGVkIGJ5IElJU1MsIGhvdyB0aGF0IGNhbiBiZSBhZ2dyZWdhdGVkIHVzaW5nIElJU1MgY2F0ZWdvcmllcywgYW5kIHRoZW4gaG93IHRoYXQgaXMgZnVydGhlciBhZ2dyZWdhdGVkIGluIHRoZSBmaW5hbCBjbGFzc2lmaWNhdGlvbi4gQSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZmVyZW50IGRhdGEgdmVyc2lvbnMgZm9sbG93cy4KCiAgXGJlZ2lue3NpbmdsZXNwYWNlfQkKCVxiZWdpbnt0YWJsZX1baF0KCQlcY2VudGVyaW5nCQkJCQoJCVxjYXB0aW9uW0NhdGVnb3JpZXMgb2YgbWlsaXRhcnkgY2FwYWJpbGl0aWVzXXtEZXNjcmlwdGlvbiBvZiB1bml0IG9mIGFuYWx5c2lzIGFuZCB2YXJpYWJsZXMgaW4gdGhlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgckRNQyBkYXRhc2V0Ln0KICAJXGJlZ2lue3RhYnVsYXJ9e3xjfGN8Y3xjfH0KCQkJXGhsaW5lCgkJCVx0ZXh0YmZ7RGF0YSBWZXJzaW9ufSAmIFx0ZXh0YmZ7VW5pdCBvZiBBbmFseXNpc30gJiBcdGV4dGJme059ICYgXHRleHRiZntWYXJpYWJsZXN9IFxcCgkJCVxobGluZQoJCQlSYXcgJiBDb3VudHJ5LXllYXItdW5pdCAmICRgciBzY2FsZXM6OmNvbW1hKG5yb3cocmRtY19yYXcpKWAkICYgU2VydmljZSwgZGlzYWdncmVnYXRlZCBjYXRlZ29yaWVzLCBjb3VudCBcXAoJCQlcaGxpbmUKCQkJTG9uZyAmIENvdW50cnkteWVhci10ZWsgJiAkYHIgc2NhbGVzOjpjb21tYShucm93KHJkbWNfbG9uZykpYCQgJiBBZ2dyZWdhdGUgY2F0ZWdvcnksIGNvdW50IFxcCgkJCVxobGluZQoJCQlXaWRlICYgQ291bnRyeS15ZWFyICYgJGByIHNjYWxlczo6Y29tbWEobnJvdyhyZG1jX3dpZGUpKWAkICYgVGVjaG5vbG9naWVzIFxcCgkJCVxobGluZQoJCVxlbmR7dGFidWxhcn0KCQlcbGFiZWx7dGFibGU6Y2F0ZWdvcmllc30KCVxlbmR7dGFibGV9CglcZW5ke3NpbmdsZXNwYWNlfQoKIyMgckRNQyByYXcKSUlTUyBjYXRlZ29yaXplcyBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgbGV2ZWxzLCBpbiBvcmRlciBvZiBpbmNyZWFzZWQgc3BlY2lmaWNpdHk6IGVxdWlwbWVudCB0eXBlcywgZXF1aXBtZW50IHN1YnR5cGVzLCBlcXVpcG1lbnQgbmFtZXMsIGVxdWlwbWVudCBzdWJuYW1lcywgYW5kIHVuaXQgbmFtZXMuXltXaGlsZSB0aGVzZSA1IGNsYXNzaWZpY2F0aW9ucyBsZXZlbHMgYXJlIHByb2R1Y2VkIGJ5IElJU1MsIHRoZWlyIGxhYmVscyBhcmUgdGhlIGF1dGhvcidzLl0gRXF1aXBtZW50IHR5cGUgaW52b2x2ZXMgdGhlIG1vc3QgYWdncmVnYXRlIGNhdGVnb3JpemF0aW9ucyBsaWtlIGFpcmNyYWZ0IG9yIGFybW9yZWQgZmlnaHRpbmcgdmVoaWNsZXMuIFN1YnR5cGUgYW5kIHN1Ym5hbWUgYXJlIGF1eGlsaWFyeSBjbGFzc2lmaWNhdGlvbnMgdGhhdCBleGlzdCBmb3Igc29tZSwgYnV0IG5vdCBhbGwgdGVjaG5vbG9naWVzLCBsaWtlIGRlc2lnbmF0aW9ucyBvZiBsaWdodCwgbWVkaXVtLCBhbmQgaGVhdnkgdmFyaWF0aW9ucyBvZiB0cmFuc3BvcnQgYWlyY3JhZnQgb3IgZGlzdGluZ3Vpc2hpbmcgZGlmZmVyZW5jZSBjbGFzc2VzIG9mIGFpcmNyYWZ0IGNhcnJpZXJzLiBFcXVpcG1lbnQgbmFtZXMgYXJlIHRoZSBuZXh0IHByaW1hcnkgSUlTUyBjYXRlZ29yaXphdGlvbiBhbmQgcHJvZHVjZSBpbmZvcm1hdGlvbiBhYm91dCBjbGFzc2lmaWNhdGlvbnMgbGlrZSB0cmFuc3BvcnQgb3IgZmlnaHRlciBhaXJjcmFmdCBvciBtYWluIGJhdHRsZSB0YW5rcyBhcyBhIHZhcmlldHkgb2YgYXJtb3JlZCBmaWdodGluZyB2ZWhpY2xlcy4gVGhlbiBhdCB0aGUgdW5pdCBsZXZlbCBvbmUgY2FuIGlkZW50aWZ5LCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBNMUExIEFicmFobXMgbWFpbiBiYXR0bGUgdGFua3MgZWFjaCBjb3VudHJ5IHBvc3Nlc3NlZC4KClRoZSBtYWluIHV0aWxpdHkgb2YgdGhlIFx0ZXh0aXR7ckRNQyByYXd9IGNhdGVnb3JpemF0aW9uIGlzIGluIHByb3ZpZGluZyBhbiBvYmplY3RpdmUgYW5kIHVuYWx0ZXJlZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBJSVNTIGRhdGEsIHRydWUgdG8gdGhlaXIgZGF0YSBnZW5lcmF0aW5nIHByb2Nlc3MuIE5vIGNvZGluZyBkZWNpc2lvbnMsIG5ldyBlcXVpcG1lbnQgY2F0ZWdvcml6YXRpb25zLCBvciBvbnRvbG9naWVzIGluZm9ybSB0aGlzIHZlcnNpb24gb2YgdGhlIGRhdGEuIEZ1cnRoZXJtb3JlLCB0aGlzIHZlcnNpb24gb2YgdGhlIGRhdGEgaXMgdW5pcXVlIGluIHByb3ZpZGluZyB1bml0LWxldmVsIGluZm9ybWF0aW9uLiBUaGlzIGxldmVsIG9mIGRpc2FnZ3JlZ2F0aW9uIGhhcyBwb3RlbnRpYWwgdXNlIGZvciBzdHVkaWVzIGV4YW1pbmluZyBxdWVzdGlvbnMgbGlrZSBjb21iYXQgZWZmZWN0aXZlbmVzcywgYXJtcyBzYWxlcywgb3IgaW50ZXJlc3QgZ3JvdXAgbG9iYnlpbmcuXltNYXRjaGluZyB2YXJpb3VzIHVuaXQgbmFtZSBzdHJpbmcgdmFyaWFibGVzIGlzIGEgY2hhbGxlbmdpbmcgZW5kZWF2b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIHRoZSB1bml0LWxldmVsIGluZm9ybWF0aW9uIGluIFx0ZXh0aXR7ckRNQyByYXd9LCBzZWUgdGhlIGFwcGVuZGl4Ll0KCkZvciBleGFtcGxlLCBzY2hvbGFycyBoYXZlIGlkZW50aWZpZWQgdGhlIGNoYWxsZW5nZXMgb2Ygb2JzZXJ2YWJsZSBwcm94aWVzIGZvciBleC1hbnRlIG1pbGl0YXJ5IGVmZmVjdGl2ZW5lc3MgW0Bicm9va3NfY3JlYXRpbmdtaWxpdGFyeXBvd2VyXzIwMDc7ICBAbWlsbGV0dF9taWxpdGFyeWVmZmVjdGl2ZW5lc3N2b2x1bWVfMjAxMDsgQG1pbGxldHRfbWlsaXRhcnllZmZlY3RpdmVuZXNzdm9sdW1lXzIwMTBhOyBAbWlsbGV0dF9taWxpdGFyeWVmZmVjdGl2ZW5lc3N2b2x1bWVfMjAxMGJdLiBAYmlkZGxlX21pbGl0YXJ5cG93ZXJleHBsYWluaW5nXzIwMDVbMTM1XSB1c2VzIHRoZSBhZ2Ugb2YgbWlsaXRhcnkgdGVjaG5vbG9neSBhcyBhIHByb3h5IGZvciBpdHMgZWZmZWN0aXZlbmVzcy4gRHVyaW5nIE9wZXJhdGlvbiBEZXNlcnQgU3Rvcm0sIHRoZSBhdmVyYWdlIGRhdGUgb2YgaW50cm9kdWN0aW9uIGZvciBVUyB3ZWFwb25zIHdhcyAxOTc0IHdoaWxlIElyYXEncyB3YXMgMTk2Mi4gQnV0IHVudGlsIG5vdywgYnJvYWRlciBtZWFzdXJlcyBvZiB0aGUgYWdlIG9mIGRpZmZlcmVudCBjb21wb25lbnRzIG9mIGEgc3RhdGUncyBtaWxpdGFyeSBwb3J0Zm9saW8gaGF2ZSByZW1haW5lZCB1bmV4YW1pbmVkLiBTY2hvbGFycyBpbnRlcmVzdGVkIGluIGRlcGVuZGVudCB2YXJpYWJsZXMgbGlrZSBtaWxpdGFyeSBlZmZlY3RpdmVuZXNzIGNvdWxkIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRpZmZlcmVudGlhdGUgdGhlIHByZWRpY3RlZCBiYXR0bGVmaWVsZCBwZXJmb3JtYW5jZSBvZiBhIHN0YXRlIHdpdGggMTAwIE0xQTIgU0VQdjIgQWJyYW1zIG1haW4gYmF0dGxlIHRhbmtzIChpbiBzZXJ2aWNlIHNpbmNlIDIwMTMpIHdpdGggYSBzdGF0ZSB3aXRoIDEwMCBULTU1IG1haW4gYmF0dGxlIHRhbmtzIChpbiBzZXJ2aWNlIHNpbmNlIDE5NDkpLiBBcyBhbiBleGFtcGxlLCBGaWd1cmUgXHJlZntmaWc6bWJ0LWludmVudGlvbn0gc2hvd3MgYSBicm9hZGVyIGNvbXBhcmlzb24gb2YgdGhlIGFnZSBvZiBpbnRyb2R1Y3Rpb24gZm9yIGVhY2ggbWFpbiBiYXR0bGUgdGFuayBpbiB0aGUgZGF0YSBhcyB3ZWxsIGFzIGl0cyBsYXN0IHJlY29yZGVkIHllYXIgaW4gc2VydmljZS4gVGhlIHllYXIgb2YgaW50cm9kdWN0aW9uIGlzIGlkZW50aWZpZWQgYXMgdGhlIGZpcnN0IHllYXIgaW4gd2hpY2ggYXQgbGVhc3Qgb25lIHN0YXRlIHBvc3Nlc3NlZCB0aGF0IHR5cGUgb2YgdGFuay5eW1NpbmNlIHRoZSBkYXRhIHN0YXJ0cyBpbiAxOTcwLCB0YW5rcyBmaXJzdCBkZXBsb3llZCBpbiAxOTcwIGFjdHVhbGx5IGxpa2VseSByZXByZXNlbnQgbW9kZWxzIGRldmVsb3BlZCBiZWZvcmUgdGhlbi4gQSBtb3JlIHRob3JvdWdoIGFuYWx5c2lzIHdvdWxkIHRyYWNrIGRvd24gdGhlIGFjdHVhbCBkZXBsb3ltZW50IGRhdGUgZm9yIGVhY2ggdGFuayBtb2RlbCwgcmF0aGVyIHRoYW4gcmVseWluZyBvbiB0aGVpciBkZXBsb3ltZW50IGRhdGUgYXMgZG9uZSBoZXJlLl0gU2luY2UgZGF0YSBhbHNvIGV4aXN0cyBhYm91dCB0aGUgb3JpZ2lucyBhbmQgbmF0aW9uYWwgcHJvZHVjZXJzIG9mIHZhcmlvdXMgbWlsaXRhcnkgdW5pdHMsIHJlc2VhcmNoIG9uIGFybXMgc2FsZXMgd291bGQgYmVuZWZpdCBmcm9tIGJlaW5nIHRvIG1vcmUgdGhvcm91Z2hseSBpZGVudGlmeSBwYXR0ZXJucyBpbiByZWxpYW5jZSBbQGNhdmVybGV5X291dGd1bm5lZGRlYmF0ZXNoaWZ0aW5nXzIwMTM7IEBlcmlja3Nvbl9kYW5nZXJvdXN0cmFkZWFybXNfMjAxOF0uCgpgYGB7ciBtYnQtaW52ZW50aW9uLCBmaWcuY2FwPSJUaGUgZmlyc3QgeWVhciBpbiB3aGljaCBlYWNoIHR5cGUgb2YgbWFpbiBiYXR0bGUgdGFuayB3YXMgZGVwbG95ZWQgYnkgYW55IHN0YXRlLiBUaGUgZmlndXJlIGlzIG9yZ2FuaXplZCBjaHJvbm9sb2dpY2FsbHksIHdpdGggdGhlIG5ld2VzdCBtYWluIGJhdHRsZSB0YW5rcyBhdCB0aGUgdG9wLiIsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTEwfQojIFJlYWQgaW4gY3N2IG9mIGNsZWFuZWQgTUJUIHN0cmluZyBuYW1lcwptYnQgPC0gcmVhZC5jc3YoZmlsZSA9IHBhc3RlMChoZXJlOjpoZXJlKCksICIvZGF0YS9hdXgvaWlzc19tYnQuY3N2IikpCgojIFJlcGxhY2UgTkEgdmFsdWVzIG9mIE1CVF9ORVcgd2l0aCBNQlRfUkFXIHZhbHVlCm1idCRtYnRfbmV3W2lzLm5hKG1idCRtYnRfbmV3KV0gPC0gYXMuY2hhcmFjdGVyKG1idCRtYnRfcmF3W2lzLm5hKG1idCRtYnRfbmV3KV0pCgojIFN1YnNldCB0byBtYWluIGJhdHRsZSB0YW5rcyBhbmQgaWRlbnRpZnkgdGhlIGVhcmxpZXN0IHllYXIgYW5kIGZpbmFsIHllYXIgZm9yIGVhY2ggc3RyaW5nIHZhbHVlCndvcmxkX3Rla19lcXB0X25hbWVfZmlyc3RfeWVhciA8LSByZG1jX3JhdyAlPiUKICBkcGx5cjo6c2VsZWN0KHllYXIsIGVxdWlwbWVudF9uYW1lLCB1bml0X25hbWUsIHVuaXRfY291bnQpICU+JQogIGRwbHlyOjphcnJhbmdlKHllYXIpICU+JQogIGRwbHlyOjpncm91cF9ieShlcXVpcG1lbnRfbmFtZSwgdW5pdF9uYW1lKSAlPiUKICBkcGx5cjo6bXV0YXRlKHVuaXRfY291bnQgPSBkcGx5cjo6aWZfZWxzZShpcy5uYSh1bml0X2NvdW50KSwgMSwgdW5pdF9jb3VudCkpICU+JQogIGRwbHlyOjpmaWx0ZXIodW5pdF9jb3VudCA+IDApICU+JQogIGRwbHlyOjpmaWx0ZXIoZXF1aXBtZW50X25hbWUgPT0gIk1CVCIpICU+JQogIGRwbHlyOjpmaWx0ZXIoIXN0cmluZ3I6OnN0cl9kZXRlY3QodW5pdF9uYW1lLCAiL3wsIikpICU+JQogIGRwbHlyOjpzbGljZSgxKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGRwbHlyOjpzZWxlY3QoLXVuaXRfY291bnQpCgp3b3JsZF90ZWtfZXFwdF9uYW1lX2xhc3RfeWVhciA8LSByZG1jX3JhdyAlPiUKICBkcGx5cjo6c2VsZWN0KHllYXIsIGVxdWlwbWVudF9uYW1lLCB1bml0X25hbWUsIHVuaXRfY291bnQpICU+JQogIGRwbHlyOjphcnJhbmdlKHllYXIpICU+JQogIGRwbHlyOjpncm91cF9ieSh1bml0X25hbWUsZXF1aXBtZW50X25hbWUpICU+JQogIGRwbHlyOjptdXRhdGUodW5pdF9jb3VudCA9IGRwbHlyOjppZl9lbHNlKGlzLm5hKHVuaXRfY291bnQpLCAxLCB1bml0X2NvdW50KSkgJT4lCiAgZHBseXI6OmZpbHRlcih1bml0X2NvdW50ID4gMCkgJT4lCiAgZHBseXI6OmZpbHRlcihlcXVpcG1lbnRfbmFtZSA9PSAiTUJUIikgJT4lCiAgZHBseXI6OmZpbHRlcighc3RyaW5ncjo6c3RyX2RldGVjdCh1bml0X25hbWUsICIvfCwiKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtZXF1aXBtZW50X25hbWUsIC11bml0X2NvdW50KSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKHllYXIgPSBkcGx5cjo6bGFzdCh5ZWFyKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKQoKbmFtZXMod29ybGRfdGVrX2VxcHRfbmFtZV9sYXN0X3llYXIpW25hbWVzKHdvcmxkX3Rla19lcXB0X25hbWVfbGFzdF95ZWFyKSA9PSAieWVhciJdIDwtICJsYXN0X3llYXIiCm5hbWVzKHdvcmxkX3Rla19lcXB0X25hbWVfZmlyc3RfeWVhcilbbmFtZXMod29ybGRfdGVrX2VxcHRfbmFtZV9maXJzdF95ZWFyKSA9PSAieWVhciJdIDwtICJmaXJzdF95ZWFyIgoKd29ybGRfdGVrX2VxcHRfbmFtZSA8LSBtZXJnZSh3b3JsZF90ZWtfZXFwdF9uYW1lX2xhc3RfeWVhciwgd29ybGRfdGVrX2VxcHRfbmFtZV9maXJzdF95ZWFyLCBieT0idW5pdF9uYW1lIikKIAojIENsZWFuIE1CVF9ORVcgaW4gTUJUIGRhdGEgc2V0IGFuZCByZW1vdmUgCm1idCRtYnRfbmV3W21idCRtYnRfbmV3ID09ICJPRi00MCBNazIgKExpb24pIl0gPC0gIk9GLTQwIE1rMiIKCmluZF9MVFRLX21idCA8LSAobWJ0JG1idF9uZXcgPT0gIkFNWC0xMyIgfCBtYnQkbWJ0X25ldyA9PSAiUGFuaGFyZCBBTUwiIHwgbWJ0JG1idF9yYXcgPT0gIjc+aU0iIHwKICAgICAgICAgICAgICAgbWJ0JG1idF9yYXcgPT0gIkFNWC0xMyIgfCBtYnQkbWJ0X3JhdyA9PSAiRmVubmVjayIgfCBtYnQkbWJ0X3JhdyA9PSAiTS0yMCIgfAogICAgICAgICAgICAgICBtYnQkbWJ0X3JhdyA9PSAiTS01NTEgU2hlcmlkYW4iIHwgbWJ0JG1idF9yYXcgPT0gIk0tNzA2IiB8IG1idCRtYnRfcmF3ID09ICJNLTc3InwgCiAgICAgICAgICAgICAgIG1idCRtYnRfcmF3ID09ICJNLTkiIHwgbWJ0JG1idF9yYXcgPT0gIlBULTc2IiB8IG1idCRtYnRfcmF3ID09ICJTYWxhZGluIiB8CiAgICAgICAgICAgICAgIG1idCRtYnRfcmF3ID09ICJULTU0IGFuZCBULTU5IiB8IG1idCRtYnRfcmF3ID09ICJUb3JuYWRvIEFEViIgfCBtYnQkbWJ0X3JhdyA9PSAiVHB6LTEgRnVjaHMiIHwgbWJ0JG1idF9yYXcgPT0gIlZBQiBSZWNvIE5CQyIgfCBtYnQkbWJ0X3JhdyA9PSAiVkJMIE0tMTEiIHwgbWJ0JG1idF9yYXcgPT0gIldpZXNlbCIpCgptYnRfY2xlYW5lZCA8LSBtYnRbIWluZF9MVFRLX21idCxdCgpuYW1lcyhtYnRfY2xlYW5lZClbbmFtZXMobWJ0X2NsZWFuZWQpID09ICJtYnRfbmV3Il0gPC0gInVuaXRfbmFtZSIKCmR1cGxpY2F0ZV9tYnQgPC0gZHVwbGljYXRlZChtYnRfY2xlYW5lZCR1bml0X25hbWUsKQoKbWJ0X2NsZWFuZWQgPC0gbWJ0X2NsZWFuZWRbIWR1cGxpY2F0ZV9tYnQsXQoKIyBDbGVhbiBVTklUX05BTUUgaW4gV09STERfVEVLX0VRUFRfTkFNRSBkYXRhIHNldCBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXMKaW5kX0xUVEtfdGVrIDwtICh3b3JsZF90ZWtfZXFwdF9uYW1lJHVuaXRfbmFtZSA9PSAiNyA+IGlNIiB8IHdvcmxkX3Rla19lcXB0X25hbWUkdW5pdF9uYW1lID09ICJBTVgtMTMiIHwgd29ybGRfdGVrX2VxcHRfbmFtZSR1bml0X25hbWUgPT0gIkZlbm5lY2siIHwgd29ybGRfdGVrX2VxcHRfbmFtZSR1bml0X25hbWUgPT0gIk0tMjAiIHx3b3JsZF90ZWtfZXFwdF9uYW1lJHVuaXRfbmFtZSA9PSAiTS01NTEgU2hlcmlkYW4iIHwgd29ybGRfdGVrX2VxcHRfbmFtZSR1bml0X25hbWUgPT0gIk0tNzA2IiB8IHdvcmxkX3Rla19lcXB0X25hbWUkdW5pdF9uYW1lID09ICJNLTc3Inwgd29ybGRfdGVrX2VxcHRfbmFtZSR1bml0X25hbWUgPT0gIk0tOSIgfCB3b3JsZF90ZWtfZXFwdF9uYW1lJHVuaXRfbmFtZSA9PSAiUFQtNzYiIHwgd29ybGRfdGVrX2VxcHRfbmFtZSR1bml0X25hbWUgPT0gIlNhbGFkaW4iIHwgd29ybGRfdGVrX2VxcHRfbmFtZSR1bml0X25hbWUgPT0gIlQtNTQgYW5kIFQtNTkiIHwgd29ybGRfdGVrX2VxcHRfbmFtZSR1bml0X25hbWUgPT0gIlRvcm5hZG8gQURWIiB8IHdvcmxkX3Rla19lcXB0X25hbWUkdW5pdF9uYW1lID09ICJUcHotMSBGdWNocyIgfCB3b3JsZF90ZWtfZXFwdF9uYW1lJHVuaXRfbmFtZSA9PSAiVkFCIFJlY28gTkJDIiB8IHdvcmxkX3Rla19lcXB0X25hbWUkdW5pdF9uYW1lID09ICJWQkwgTS0xMSIgfCB3b3JsZF90ZWtfZXFwdF9uYW1lJHVuaXRfbmFtZSA9PSAiV2llc2VsIikKCndvcmxkX3Rla19lcXB0X25hbWVfY2xlYW5lZCA8LSB3b3JsZF90ZWtfZXFwdF9uYW1lWyFpbmRfTFRUS190ZWssXQoKZHVwbGljYXRlX3d0ZSA8LSBkdXBsaWNhdGVkKHdvcmxkX3Rla19lcXB0X25hbWVfY2xlYW5lZCR1bml0X25hbWUpCgp3b3JsZF90ZWtfZXFwdF9uYW1lX2NsZWFuZWQgPC0gd29ybGRfdGVrX2VxcHRfbmFtZV9jbGVhbmVkWyFkdXBsaWNhdGVfd3RlLF0KCiMgTWVyZ2UgRGF0YSBieSBVTklUX05BTUUKbWVyZ2VfbWJ0X3llYXIgPC0gbWVyZ2Uod29ybGRfdGVrX2VxcHRfbmFtZV9jbGVhbmVkLCBtYnRfY2xlYW5lZCwgYnk9InVuaXRfbmFtZSIpCgojIFBsb3QKZ2dwbG90KG1lcmdlX21idF95ZWFyLAogICAgICAgYWVzKHggPSBmaXJzdF95ZWFyLAogICAgICAgICAgIHhlbmQgPSBsYXN0X3llYXIsCiAgICAgICAgICAgeSA9IHJlb3JkZXIodW5pdF9uYW1lLCBmaXJzdF95ZWFyKSkpICsKICBnZ2FsdDo6Z2VvbV9kdW1iYmVsbChkYXRhID0gbWVyZ2VfbWJ0X3llYXIsCiAgICAgICAgICAgICAgICBhZXMoeSA9IHJlb3JkZXIodW5pdF9uYW1lLCBmaXJzdF95ZWFyKSwKICAgICAgICAgICAgICAgICAgICB4ID0gZmlyc3RfeWVhciwgeGVuZCA9IGxhc3RfeWVhciksCiAgICAgICAgICAgICAgICBzaXplPTEuMCwKICAgICAgICAgICAgICAgIGNvbG9yPSJibHVlIiwKICAgICAgICAgICAgICAgIHNpemVfeCA9IDEuNSwKICAgICAgICAgICAgICAgIHNpemVfeGVuZCA9IDEuNSwKICAgICAgICAgICAgICAgIGNvbG91cl94ID0gImJsdWUiLAogICAgICAgICAgICAgICAgY29sb3VyX3hlbmQgPSAiYmx1ZSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKG1pbihtZXJnZV9tYnRfeWVhciRmaXJzdF95ZWFyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgobWVyZ2VfbWJ0X3llYXIkbGFzdF95ZWFyKSwgYnkgPSA1KSwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInByZS0xOTcwIiwgIjE5NzUiLCAiMTk4MCIsICIxOTg1IiwiMTk5MCIsIjE5OTUiLCIyMDAwIiwiMjAwNSIsIjIwMTAiKSkgKwogIGxhYnModGl0bGUgPSAiTWFpbiBCYXR0bGUgVGFua3M6IFllYXJzIG9mIE9wZXJhdGlvbiAoMTk3MC0yMDE0KSIsCiAgICAgICB4ID0gIlllYXIiICwKICAgICAgIHkgPSAiTWFpbiBCYXR0bGUgVGFuayIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZTogSUlTUyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCmBgYAoKIyMgckRNQyBsb25nIGFuZCByRE1DIHdpZGUKRnJvbSB0aGlzLCB0aGUgdGVjaG5vbG9neSBjYXRlZ29yaWVzIGFyZSBhZ2dyZWdhdGVkIHRvIGEgbmV3IHR5cG9sb2d5IHJlcHJlc2VudGluZyB2YXJpZXR5IGluIG1pbGl0YXJ5IHRlY2hub2xvZ2llcyBvZiBpbnRlcmVzdCB0byBzY2hvbGFycyB3aG8gaGF2ZSBsZXNzIG9mIGEgbmVlZCBmb3IgZ3JhbnVsYXIgaW5mb3JtYXRpb24gZGlmZmVyZW50aWF0aW5nIE0xQTEgQWJyYWhtcyB0YW5rcyBmcm9tIE0xQTIgQWJyYWhtcyB0YW5rcyBhbmQgYXJlIGluc3RlYWQgaW50ZXJlc3QgaW4gdGhlIG51bWJlciBvZiBhcm1vcmVkIGNvbWJhdCB2ZWhpY2xlcyBhIHN0YXRlIHBvc3Nlc3Nlcy4gSSBmaXJzdCBhZ2dyZWdhdGVkIHRoZSB0ZWNobm9sb2dpZXMgdG8gdW5pcXVlIHRyaXBsZXMgY29tcG9zZWQgb2YgZXF1aXBtZW50IHR5cGUsIHN1YnR5cGUsIGFuZCBuYW1lIHVzaW5nIHRoZSBJSVNTIGNhdGVnb3JpemF0aW9ucy4gVGhpcyB0eXBvbG9neSBpcyBjb25zaXN0ZW50IGFjcm9zcyBjb3VudHJ5IGFuZCB5ZWFyLCB0aHVzIHNpbXBsaWZ5aW5nIHRoZSBwcm9jZXNzIG9mIHRpbWUgc2VyaWVzLWNyb3NzIHNlY3Rpb25hbCBhbmFseXNpcy4gV2hlcmUgaW5jb25zaXN0ZW5jaWVzIGFyaXNlLCBjb2RpbmcgZGVjaXNpb25zIHdlcmUgbWFkZSB3aXRoIHJlZmVyZW5jZSB0byBleHRlcm5hbCBzb3VyY2VzIGFuZCB0cmFuc3BhcmVudGx5IGNvZGVkIGluIHRoZSBkYXRhIGF2YWlsYWJsZSBvbmxpbmUuIFRoaXMgZW5zdXJlIHRoYXQsIGZvciBleGFtcGxlLCB0aGUgQy0xMzBIIEhlcmN1bGVzIGlzIGFsd2F5cyBsaXN0ZWQgd2l0aCBhbiBlcXVpcG1lbnQgdHlwZSBjb2Rpbmcgb2YgJ2FpcmNyYWZ0JyBhbmQgYW4gZXF1aXBtZW50IG5hbWUgY29kaW5nIG9mIGB0cmFuc3BvcnQgKFRQVCknLl5bVGhlcmUgYXJlIGNhc2VzIHdoZXJlIGFuIGVxdWlwbWVudCdzIGNhdGVnb3J5IGNoYW5nZXMgaW4gd2F5cyB0aGUgZGF0YSBtYWludGFpbnMuIEZvciBleGFtcGxlLCBtYW55IGFpcmNyYWZ0IGFuZCBoZWxpY29wdGVycyBhcmUgcGhhc2VkIG91dCBieSBiZWluZyBzaGlmdGVkIHRvIG5vbi1jb21iYXQgcm9sZXMgbGlrZSB0cmFpbmluZyBiZWZvcmUgdGhleSBhcmUgZnVsbHkgcmV0aXJlZC4gQSBjb3VudHJ5IG1heSB0aHVzIGV4cGVyaWVuY2UgYSBkZWNyZWFzZSBpbiBjb21iYXQgYWlyY3JhZnQgYW5kIGFuIGluY3JlYXNlIGluIHRyYWluaW5nIGFpcmNyYWZ0IGZyb20gb25lIHllYXIgdG8gdGhlIG5leHQgd2l0aG91dCB0aGUgYWN0dWFsIGFpcmNyYWZ0IHRoZXkgcG9zc2VzcyBjaGFuZ2luZy5dIFRoaXMgcmVzdWx0cyBpbiBhIGNvdW50IGZvciAiYWlyY3JhZnQgLS0gdHJhbnNwb3J0IiBmb3IgZXZlcnkgY291bnRyeSB3aXRoIGEgdmFsdWUgdGhhdCBpcyB0aGUgc3VtIG9mIGFsbCB1bml0cyB0aGF0IGNvdW50cnkgcG9zc2Vzc2VkIHRoYXQgaGFkIHRoZSBlcXVpcG1lbnQgdHlwZSwgc3VidHlwZSwgbmFtZSwgc3VibmFtZSwgYW5kIHVuaXQgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoYXQgaGlnaGVyIGxldmVsIGFnZ3JlZ2F0aW9uLgoKXHRleHRpdHtyRE1DIGxvbmd9IGFuZCBcdGV4dGl0e3JETUMgd2lkZX0gYXJlIGlkZW50aWNhbCBpbiB0ZXJtcyBvZiBjb250ZW50IGFuZCBkaWZmZXIgb25seSBpbiB0aGUgdW5pdCBvZiBhbmFseXNpcy4gSW4gXHRleHRpdHtyRE1DIGxvbmd9LCB0aGUgdW5pdCBvZiBhbmFseXNpcyBpcyB0aGUgY291bnRyeS15ZWFyLXRlY2hub2xvZ3ksIHNvIHRoZSBvbmx5IHZhcmlhYmxlIGZvciBlYWNoIHJvdyBpcyB0aGUgbnVtZXJpYyBjb3VudCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmlxdWUgaWRlbnRpZmllci4gSW4gXHRleHRpdHtyRE1DIHdpZGV9LCB0aGUgdW5pdCBvZiBhbmFseXNpcyBpcyB0aGUgY291bnRyeS15ZWFyIHdpdGggZWFjaCB1bmlxdWUgdGVjaG5vbG9neSB2YWx1ZSBiZWNvbWluZyBpdHMgb3duIGNvbHVtbi4gQWx0aG91Z2ggYm90aCB2ZXJzaW9ucyBhcmUgc3Vic3RhbnRpdmVseSBpZGVudGljYWwsIGJvdGggYXJlIHByb3ZpZGVkIGFzIHJlc2hhcGVkIHZlcnNpb25zIG9mIGVhY2ggb3RoZXIgdG8gc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2Ygc3Vic2V0dGluZyBhbmQgbWVyZ2luZyB3aXRoIG90aGVyIGRhdGFzZXRzLiBHaXZlbiB0aGVpciBpbnRlcmNoYW5nZWFiaWxpdHksIGluIHRoZSBzZWN0aW9uIHRoYXQgZm9sbG93cywgZWl0aGVyIHZlcnNpb24gY2FuIGJlIHVzZWQgdG8gcHJvZHVjZSBzdWJzdGFudGl2ZWx5IGlkZW50aWNhbCBmaWd1cmVzIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3MuCgpUaGUgYHIgc2NhbGVzOjpjb21tYShkcGx5cjo6bl9kaXN0aW5jdChyZG1jX2xvbmckdGVrKSlgIGNhdGVnb3JpZXMgdGhhdCBjb21wcmlzZSB0aGUgdGVjaG5vbG9naWVzIGFyZSBzaG93biBpbiBGaWd1cmUgXHJlZntmaWc6ZGVuZHJvZ3JhbX0uIEVtcGlyaWNhbGx5LCB0aGlzIGFnZ3JlZ2F0aW9uIGlzIGhlbHBmdWwgYmVjYXVzZSB0aGUgdGVjaG5vbG9neSBjYXRlZ29yaWVzIGFyZSBkZWZpbml0aW9uYWxseSB1bmlmb3JtIGFjcm9zcyB0aGUgZGF0YSBzYW1wbGUuIFRoZW9yZXRpY2FsbHksIHRoZXNlIGNhdGVnb3JpZXMgd2VyZSBjaG9zZW4gYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB3ZWFwb25zIGNhdGVnb3JpZXMgY29tbW9ubHkgcmVjb2duaXplZCBhbmQgdXNlZCBieSBzdGF0ZXMgaW4gYXJtcyByZWR1Y3Rpb24gYWdyZWVtZW50cyBsaWtlIHRoZSBUcmVhdHkgb24gQ29udmVudGlvbmFsIEFybWVkIEZvcmNlcyBpbiBFdXJvcGUgKENGRSkuIEFzIGEgcmVzdWx0LCBuYXRpb25hbCByZWNvcmRzIGFyZSBtb3N0IGNvbnNpc3RlbnQgYW5kIGFjY3VyYXRlIGF0IHRoaXMgbGV2ZWwgb2YgYW5hbHlzaXMgc2luY2UgdGhvc2UgcmVjb3JkcyB3ZXJlIHVzZWQgZHVyaW5nIGludGVybmF0aW9uYWwgbmVnb3RpYXRpb25zLgoKQ29tcHV0YXRpb25hbGx5LCBhZ2dyZWdhdGluZyB0aGUgdGVjaG5vbG9neSBjYXRlZ29yaWVzIGFsc28gcmVkdWNlcyB0aGUgc3BhcnNlbmVzcyBvZiBhIGRhdGEgc2V0IHRoYXQgaXMgYWxyZWFkeSB6ZXJvLWluZmxhdGVkLiBXaGlsZSBtb3N0IGNvdW50cnkteWVhcnMgcG9zc2VzcyBhcm1vcmVkIGZpZ2h0aW5nIHZlaGljbGVzLCBub3QgYWxsIHBvc3Nlc3MgZXZlcnkga2luZCBvZiBhcm1vcmVkIGZpZ2h0aW5nIHZlaGljbGUgKG1haW4gYmF0dGxlIHRhbmtzLCBhcm1vcmVkIHBlcnNvbm5lbCBjYXJyaWVycywgYXJtb3JlZCBpbmZhbnRyeSBmaWdodGluZyB2ZWhpY2xlcywgYW5kIHJlY29ubmFpc3NhbmNlIHZlaGljbGVzKSBsZXQgYWxvbmUgZWFjaCBvZiB0aGUgYHIgcmRtY19yYXcgJT4lIGRwbHlyOjpmaWx0ZXIoZXF1aXBtZW50X3R5cGUgPT0gImFybW91cmVkIGZpZ2h0aW5nIHZlaGljbGVzIikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoY291bnQgPSBkcGx5cjo6bl9kaXN0aW5jdCh1bml0X25hbWUpKWAgZGlzdGluY3QgdW5pdHMgY2F0ZWdvcml6ZWQgYXMgImFybW9yZWQgZmlnaHRpbmcgdmVoaWNsZXMiLiBUaGF0IGlzIG5vdCB0byBzYXkgdGhhdCBldmVyeSB0eXBlIG9yIG1vZGVsIGlzIHRoZSBzYW1lOyBpZiBpdCB3YXMgdGhlbiA2LDAwMCsgVW5pdGVkIFN0YXRlcyBhcm1vcmVkIHBlcnNvbm5lbCBjYXJyaWVycyB3b3VsZCBub3QgYmUgc3BsaXQgYWNyb3NzIDUgZGlmZmVyZW50IG1vZGVscy4gQnV0IHRob3NlIGRpc3RpbmN0aW9ucyBwcmVzZW50IGNvbXB1dGF0aW9uYWwgY2hhbGxlbmdlcyBnaXZlbiB0aGF0IGV2ZW4gdGhlIG1pbGl0YXJpbHktY2FwYWJsZSBVbml0ZWQgU3RhdGVzIHBvc3Nlc3NlcyBvbmx5IGEgc21hbGwgZnJhY3Rpb24gb2YgYWxsIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgYXJtb3JlZCBwZXJzb25uZWwgY2FycmllcnMgdGhhdCBleGlzdC4gQXMgYSByZXN1bHQsIGNvdW50cnktc3BlY2lmaWMgdW5pdHMgd291bGQgaW5mbGF0ZSBpbmZlcmVuY2VzIGFib3V0IGJldHdlZW4tY291bnRyeSB2YXJpYXRpb24gaW4gbWlsaXRhcnkgcG9ydGZvbGlvcy4gU2Nob2xhcnMgaW50ZXJlc3RlZCBpbiBtYWtpbmcgdGhvc2Ugc29ydHMgb2YgZGlzdGluY3Rpb25zIGFyZSBhZHZpc2VkIHRvIHVzZSB0aGUgXHRleHRpdHtyRE1DIHJhd30gdmVyc2lvbiBvZiB0aGUgZGF0YS4KCmBgYHtyIGRlbmRyb2dyYW0sIGZpZy5jYXAgPSAiRGVzY3JpcHRpb24gb2YgdGhlIGFnZ3JlZ2F0ZWQgdGVjaG5vbG9naWVzIHVzZWQgdG8gY29tcHV0ZSB0aGUgZGlzdHJpYnV0aW9uIG9mIG1pbGl0YXJ5IGNhcGFiaWxpdGllcy4iLCBvdXQud2lkdGggPSAnMTAwJSd9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKHBhdGggPSBwYXN0ZTAoaGVyZTo6aGVyZSgpLCAiL3BhcGVyL2RlbmRyb2dyYW1fc3ViamVjdGl2ZV9mdWxsLnBuZyIpKQpgYGAKClRoZXJlIGFyZSwgb2YgY291cnNlLCBtYW55IHdheXMgdG8gY2F0ZWdvcml6ZSB0ZWNobm9sb2dpZXMuIFNvbWUgY2F0ZWdvcmllcyBjb3VsZCBiZSBncm91cGVkIHRvZ2V0aGVyIGRlcGVuZGluZyBvbiB0aGUgcmVzZWFyY2ggaW50ZXJlc3QuICJBaXJjcmFmdCAtLSB0cmFuc3BvcnQiIGFuZCAiaGVsaWNvcHRlcnMgLS0gdHJhbnNwb3J0IiBjb3VsZCBiZSBjb25zaWRlcmVkIHNvbWV3aGF0IGludGVyY2hhbmdlYWJsZSB0byB0aG9zZSBpbnRlcmVzdGVkIGluIGEgc3RhdGUncyBhYmlsaXR5IHRvIG1vdmUgcGVyc29ubmVsIGFuZCBtYXRlcmlhbCB2aWEgdGhlIGFpci4gQWx0ZXJuYXRpdmVseSwgImhlbGljb3B0ZXJzIC0tIHRyYW5zcG9ydCIgY291bGQgYmUgZ3JvdXBlZCB3aXRoICJoZWxpY29wdGVycyAtLSBzZWFyY2ggYW5kIHJlc2N1ZSIgaWYgc3R1ZHlpbmcgYSB0b3BpYyBsaWtlIGFybXMgc2FsZXMgb3IgbWlsaXRhcnkgYmFzZSBsb2NhdGlvbiBnaXZlbiBzaW1pbGFyaXR5IGluIHRoZWlyIHBoeXNpY2FsIG1ha2UtdXAuIFNvbWUgY2F0ZWdvcmllcyBjb3VsZCBhbHNvIGJlIGZ1cnRoZXIgKmRpcyphZ2dyZWdhdGVkLiBUaGUgY2F0ZWdvcnkgImFpcmNyYWZ0IC0tIG1hcml0aW1lIHBhdHJvbCIsIGZvciBleGFtcGxlLCBpbmNsdWRlIGFudGktc3VibWFyaW5lIHdhcmZhcmUsIGFudGktc3VyZmFjZSB3YXJmYXJlLCBhbmQgbWFyaXRpbWUgcmVjb25uYWlzc2FuY2Ugd2hpY2ggYWxsICJwYXRyb2wiIGRpZmZlcmVudCBhcmVhcyBvZiB0aGUgc2VhLiBBc2lkZSBmcm9tIHRoZXNlIGRlZHVjdGl2ZSB3YXlzIG9mIGFnZ3JlZ2F0aW5nIG9yIGRpc2FnZ3JlZ2F0aW5nIHRoZSBtaWxpdGFyeSB0ZWNobm9sb2dpZXMsIGluZHVjdGl2ZSBtZXRob2RzIGNvdWxkIGlkZW50aWZ5IGRpZmZlcmVudCBzZXRzIG9mIHNpbWlsYXIgdGVjaG5vbG9naWVzIGJhc2VkIG9uIHRoaW5ncyBsaWtlIHJhcml0eSwgcGFpcndpc2Ugb2NjdXJyZW5jZSwgb3IgY29tcG9uZW50IHBhcnRzIFtAZG91Z2xhc3NfY2h1cm5pbmdidXR0ZXJndW5zXzIwMTldLiBSYXRoZXIgdGhhbiB0cnkgdG8gY3JlYXRlIGFuZCBqdXN0aWZ5IGEgc2luZ2xlIGRlZmluaXRpdmUgb250b2xvZ3kgb2YgbWlsaXRhcnkgdGVjaG5vbG9naWVzLCB0aGUgZGF0YSBhcmUgY29uc3RydWN0ZWQgc28gdGhhdCBhbGwgYWdncmVnYXRpb25zIGFyZSB0cmFuc3BhcmVudCBhbmQsIG1vcmUgaW1wb3J0YW50bHksIG1vZHVsYXIuIEJ5IHNpbXBseSBzZWxlY3RpbmcgbmV3IGFnZ3JlZ2F0aW9uIGNhdGVnb3JpZXMsIHNjaG9sYXJzIGNhbiBwcm9kdWNlIHRoZWlyIG93biBjb3VudHMgd2l0aCBkaWZmZXJlbnQgY2F0ZWdvcmllcy4gU2Nob2xhcnMgd2hvIHdpc2ggdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRob3NlIGNhdGVnb3JpZXMgY2FuIHRyYW5zcGFyZW50bHkgc2VlIGhvdyB0aG9zZSB3ZXJlIGFnZ3JlZ2F0ZWQsIGNoYW5nZSB0aG9zZSBhZ2dyZWdhdGlvbnMgKGluY2x1ZGluZyBjcmVhdGluZyBuZXcgdGVjaG5vbG9neSBjYXRlZ29yaWVzIG9yIGRlbGV0aW5nIGV4aXN0aW5nIG9uZXMpLCBhbmQgcHJvZHVjZSBhIG5ldyBkYXRhc2V0IGNvbnNpc3RlbnQgd2l0aCB0aGUgY2xhc3NpZmljYXRpb25zIHRoYXQgc3VpdGUgdGhlaXIgcmVzZWFyY2ggcXVlc3Rpb25zLgoKIyBHbG9iYWwgVHJlbmRzClRoaXMgc2VjdGlvbiBpZGVudGlmaWVzIHNvbWUgZGVzY3JpcHRpdmUgdHJlbmRzIGluIG1pbGl0YXJ5IGNhcGFiaWxpdGllcyBhY3Jvc3Mgc3BhY2UgYW5kIHRpbWUgdG8gaGlnaGxpZ2h0IHdheXMgc2Nob2xhcnMgY2FuIHVzZSB0aGVzZSBkYXRhIHRvIHN1cHBsZW1lbnQgb25nb2luZyByZXNlYXJjaCBvbiBpbnRlcm5hdGlvbmFsIHNlY3VyaXR5LgoJCiMjIFRlY2hub2xvZ2ljYWwgVHJlbmRzIEFjcm9zcyBUaW1lClJlc2VhcmNoIG9uIG1pbGl0YXJ5IGlubm92YXRpb24gaGFzIGludmVzdGlnYXRlZCBib3RoIHRoZSBjYXVzZXMgb2YgbWlsaXRhcnkgaW5ub3ZhdGlvbiBhcyB3ZWxsIGFzIGl0cyBjb25zZXF1ZW5jZXMgW0BtdXJyYXlfbWlsaXRhcnlhZGFwdGF0aW9ud2FyXzIwMDldLiBPbmUgd2F5IHRoYXQgbWlsaXRhcmllcyBpbm5vdmF0ZSBpcyBpbiB0aGUgd2VhcG9ucyB0aGV5IGNob29zZSB0byBmaWdodC4gVGhpcyB0ZWNobm9sb2dpY2FsIGlubm92YXRpb24gKG9yIGxhY2sgdGhlcmVvZikgbWF5IGJlIGEgcHJvZHVjdCBvZiBtaWxpdGFyeSBjdWx0dXJlIFtAcG9zZW5fbWVhc3VyaW5nZXVyb3BlYW5jb252ZW50aW9uYWxfMTk4NDsgQHNueWRlcl9pZGVvbG9neW9mZmVuc2l2ZW1pbGl0YXJ5XzE5ODk7IEBraWVyX2ltYWdpbmluZ3dhcmZyZW5jaF8xOTk3OyBAYWRhbXNreV9jdWx0dXJlbWlsaXRhcnlpbm5vdmF0aW9uXzIwMTA7IEByYXRoc19nZXJtYW50YW5rcHJvZHVjdGlvbl8yMDExXSwgYnVyZWF1Y3JhY3kgW0BhdmFudF9wb2xpdGljYWxpbnN0aXR1dGlvbnNtaWxpdGFyeV8xOTk0XSwgZXhwZXJpZW5jZSBpbiBwYXN0IGNvbmZsaWN0cyBbQGtyZXBpbmV2aWNoX2FybXl2aWV0bmFtXzE5ODY7IEByb3Nlbl93aW5uaW5nbmV4dHdhcl8xOTkxOyBAc29ybGV5X2JldHRlcndhcnVuZXhhbWluZWRfMTk5OTsgQG5hZ2xfbGVhcm5pbmdlYXRzb3VwXzIwMDVdLCByZWdpbWUgdHlwZSBbQHJvc2VuX3ZpZXRuYW1hbWVyaWNhbnRoZW9yeV8xOTgyOyBAY2F2ZXJsZXlfbXl0aG1pbGl0YXJ5bXlvcGlhXzIwMDldLCBhY2Nlc3MgdG8gZm9yZWlnbiB0ZWNobm9sb2d5IFtAZG9tYnJvd3NraV9idXlpbmdtaWxpdGFyeXRyYW5zZm9ybWF0aW9uXzIwMDY7IEBjaGV1bmdfaW5ub3ZhdGlvbmNoaW5hZGVmZW5zZV8yMDE2XSwgdGhlIG5hdHVyZSBvZiB0aGUgaW50ZXJuYXRpb25hbCB0aHJlYXQgZW52aXJvbm1lbnQgW0BsYXl0b25fd2FzdGhlcmVwZWFybF8xOTg1OyBAZmFpcmJhbmtzX2Nob29zaW5ndGVjaG5vbG9naWVzYW5nbG9nZXJtYW5fMTk4OF0sIG9yIGJyb2FkIHBvbGl0aWNhbCBnb2FscyBbQGhhcmtuZXNzX21pbGl0YXJ5bWFsYWRhcHRhdGlvbmNvdW50ZXJpbnN1cmdlbmN5XzIwMTVdLgoKWWV0IHRoaXMgcmVzZWFyY2ggb24gdGhlIGRyaXZlcnMgb2YgdGVjaG5vbG9naWNhbCBtaWxpdGFyeSBpbm5vdmF0aW9uIGhhcyBiZWVuIGxpbWl0ZWQgaW4gZW1waXJpY2FsIHNjb3BlIHRvIHBhcnRpY3VsYXIgdGVjaG5vbG9naWVzLCBzdGF0ZXMsIGFuZCB0aW1lIHBlcmlvZHMuIFVzaW5nIG5ldyBkYXRhIG9uIGNoYW5nZXMgaW4gbWlsaXRhcnkgY2FwYWJpbGl0aWVzIG92ZXIgdGltZSBjb3VsZCBzdXBwbGVtZW50IHRoaXMgZXhpc3Rpbmcgd29yayBieSBoZWxwaW5nIGlkZW50aWZ5IHRoZSBmYWN0cyB0aGF0IGV4cGxhaW4gd2hlbiBzdGF0ZXMgYnVjayB0aGUgcGF0dGVybiBvZiB0ZWNobm9sb2dpY2FsIGlubm92YXRpb24gYXMgd2VsbCBhcyBob3cgaW5ub3ZhdGlvbiBkaWZmdXNlcyBhY3Jvc3MgdGltZSBhbmQgc3BhY2UgW0Bob3Jvd2l0el9kaWZmdXNpb25taWxpdGFyeXBvd2VyXzIwMTA7IEBnaWxsaV9zcHJlYWRtaWxpdGFyeWlubm92YXRpb25zXzIwMTQ7IEBjaGV1bmdfY29uY2VwdHVhbGZyYW1ld29ya2RlZmVuY2VfMjAyMV0uIEZpZ3VyZSBccmVme2ZpZzpjb21tb24tdGVrc30gc2hvd3MgdGhlIG51bWJlciBvZiBjb3VudHJpZXMgdGhhdCBwb3NzZXNzZWQgZWFjaCBtaWxpdGFyeSB0ZWNobm9sb2d5IGluIGEgZ2l2ZW4geWVhci4gQWx0aG91Z2ggdGhlcmUgaXMgYSBnZW5lcmFsIGdsb2JhbCB0cmVuZCBvZiBpbm5vdmF0aW9uLCB0aGUgbnVtYmVyIG9mIHN0YXRlcyBwb3NzZXNzaW5nIGNlcnRhaW4gY2FwYWJpbGl0aWVzIGxpa2Ugc3VyZmFjZS10by1haXIgYW5kIHN1cmZhY2UtdG8tc3VyZmFjZSBtaXNzaWxlcyBoYXMgaW5jcmVhc2VkIGRyYW1hdGljYWxseSBzaW5jZSAxOTcwLiBUaGlzIGlzIGluIG1hcmtlZCBjb250cmFzdCB0byBiYWxsaXN0aWMgbWlzc2lsZXMsIHdoZXJlIHRoZWlyIGRpZmZ1c2lvbiBvdmVyIHRpbWUgaGFzIGJlZW4gbXVjaCBtb3JlIGxpbWl0ZWQuXltGb3IgZXhpc3Rpbmcgd29yayBvbiBtaXNzaWxlIHByb2xpZmVyYXRpb24sIHNlZSBAa2Fobl93aG9nZXRzc21hcnRfMjAyMSBhbmQgQHNjaHdhcnR6X2NvbXBldGVyZXRyZWF0Z2xvYmFsXzIwMjEuXQoKYGBge3IgY29tbW9uLXRla3MsIGZpZy5jYXAgPSAiVGhlIG51bWJlciBvZiBjb3VudHJpZXMgcG9zc2Vzc2luZyBhdCBsZWFzdCBvbmUgdW5pdCBvZiBlYWNoIG1ham9yIG1pbGl0YXJ5IGNhdGVnb3J5IG9mIHRlY2hub2xvZ3kuIERhcmtlciBjZWxscyBtZWFuIG1vcmUgY291bnRyaWVzIHBvc3Nlc3NlZCB0aGF0IHRlY2hub2xvZ3kgaW4gdGhhdCB5ZWFyLiIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MocGF0aCA9IHBhc3RlMChoZXJlOjpoZXJlKCksICIvcGFwZXIvY29tbW9uX3Rla3NfcGVyX3llYXIucG5nIikpCmBgYAoKVG8gaWRlbnRpZnkgYSBtb3JlIHNwZWNpZmljIGV4YW1wbGUsIG11Y2ggaGFzIGJlZW4gd3JpdHRlbiBhYm91dCB0aGUgY29uc2VxdWVuY2VzIG9mIGFlcmlhbCBib21iaW5nIGNhbXBhaWducyBhbmQgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgYWlyIHBvd2VyIG1vcmUgZ2VuZXJhbGx5IFtAcGFwZV9ib21iaW5nd2luYWlyXzE5OTY7IEBtYXJ0aW5lem1hY2hhaW5fYWlyY2FtcGFpZ25kdXJhdGlvbl8yMDE1OyBAYWxsZW5fdW5kZXJzdGFuZGluZ2ltcGFjdGFpcl8yMDE3XS4gQWx0aG91Z2ggdGhpcyByZXNlYXJjaCBoYXMgbG9va2VkIGF0IGNhc2VzIHdoZXJlIHN0YXRlcyB1c2VkIGFlcmlhbCBib21iaW5nLCBpdCBkb2VzIG5vdCBpZGVudGlmeSB3aGF0IHN0YXRlcyBoYXZlIHRoZSBjYXBhY2l0eSB0byBjb25kdWN0IGFlcmlhbCBib21iaW5nIG9yIGhvdyB0aGF0IGNoYW5nZXMgb3ZlciB0aW1lLl5bTmV3IGRhdGEgb24gY29tYmF0IGFpcmNyYWZ0IGhhcyByZWNlbnRseSBiZWVuIHByb2R1Y2VkIGJ5IEBzYXVuZGVyc19jb21tYW5kc2tpZXNhaXJwb3dlcl8yMDIwLl0gRmlndXJlIFxyZWZ7ZmlnOmFpcmNyYWZ0fSBzaG93cyB0aGUgdG90YWwgbnVtYmVyIG9mIG1pbGl0YXJ5IGFpcmNyYWZ0IGFjcm9zcyB0aGUgZ2xvYmFsIGFubnVhbGx5IGFzIHdlbGwgYXMgY2hhbmdlcyBpbiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsaXRhcnkgYWlyY3JhZnQgcG9zc2Vzc2VkIGJ5IGVhY2ggc3RhdGUuIFRoZSBlbmQgb2YgdGhlIENvbGQgV2FyIGluIDE5OTEgaXMgYW4gaW1wb3J0YW50IHR1cm5pbmcgcG9pbnQgaW4gYm90aCByZXNwZWN0cy4gVGhlIG51bWJlciBvZiB0b3RhbCBtaWxpdGFyeSBhaXJjcmFmdCBpbiB0aGUgd29ybGQgZHJvcHBlZCBmcm9tIHJvdWdobHkgNDAsMDAwIHRvIGp1c3Qgb3ZlciAyMCwwMDAgYW5kIHRoZSBhdmVyYWdlIG1pbGl0YXJ5IGFpcmNyYWZ0IHBlciBjb3VudHJ5IHdlbnQgZnJvbSBhcm91bmQgNDAwIHRvIGp1c3QgdW5kZXIgMjAwLiBXaGF0IGNhdXNlZCB0aGlzIHNpZ25pZmljYW50IHJlZHVjdGlvbiBpbiB0aGUgbnVtYmVyIG9mIGNvbWJhdCBhaXJjcmFmdCB3b3JsZHdpZGU/IFBhcnQgb2YgdGhlIGV4cGxhbmF0aW9uIG1heSBiZSB0aGUgQWRhcHRlZCBUcmVhdHkgb24gQ29udmVudGlvbmFsIEFybWVkIEZvcmNlcyBpbiBFdXJvcGUgKENGRSkgd2hpY2ggcmVxdWlyZWQgTkFUTyBhbmQgdGhlIFdhcnNhdyBQYWN0IC0tIHJlZmVycmVkIHRvIGluIHRoZSBDRkUgYXMgdGhlIGBgR3JvdXBzIG9mIFN0YXRlcyIgLS0gdG8gZWFjaCBtYWludGFpbiBubyBtb3JlIHRoYW4gNiw4MDAgY29tYmF0IGFpcmNyYWZ0IFtAYm9sdmluZ19hZGFwdGVkdHJlYXR5Y29udmVudGlvbmFsXzIwMDBdLiBUaGlzIHJlc3VsdGVkIGluIHRoZSBkZXN0cnVjdGlvbiBvZiA2OSwwMDAgbWlsaXRhcnkgY2FwYWJpbGl0aWVzIGRlc2lnbmF0ZWQgYXMgVHJlYXR5IExpbWl0ZWQgRXF1aXBtZW50LCB3aXRoIHRoZSBXYXJzYXcgUGFjdCBkZXN0cm95aW5nIG92ZXIgMzBcJSBvZiBpdHMgYXJzZW5hbCBhbmQgTkFUTyBkZXN0cm95aW5nIDVcJSBbQGp1cnNraV9jb252ZW50aW9uYWxhcm1zZm9yY2VzXzIwMDU7IEBtY2NhdXNsYW5kX2V1cm9wZWFuZXVyYXNpYW5zZWN1cml0eV8yMDEyXS4gUGFydCBvZiB0aGUgZXhwbGFuYXRpb24gbWF5IGFsc28gY29uY2VybiBkaWZmaWN1bHR5IGNvdW50aW5nIGNhcGFiaWxpdGllcyBpbiBuZXcgZm9ybWVyIFNvdmlldCBzdGF0ZXMgdGhhdCBkaWQgbm90IHlldCBoYXZlIHRoZSBwb2xpdGljYWwgb3Igc2VjdXJpdHkgaW5mcmFzdHJ1Y3R1cmUgdG8gYWNjdXJhdGVseSBkb2N1bWVudCBtaWxpdGFyeSBob2xkaW5ncy4gSW4gdGhlIHNhbWUgd2F5IHRoYXQgbmV3IGRhdGEgb24gbWlsaXRhcnkgc3BlbmRpbmcgYW5kIEdEUCBoYXMgYWxsb3dlZCBzY2hvbGFycyB0byBleHBsYWluIGRpc2NyZXBhbmNpZXMgYW5kIGlycmVndWxhcml0aWVzIGluIHRoZSBkYXRhLCB0aGUgc2FtZSBjYW4gbm93IGJlIGRvbmUgZm9yIG1pbGl0YXJ5IGVxdWlwbWVudCBkYXRhLgoKYGBge3IgYWlyY3JhZnQsIGZpZy5jYXAgPSAiQmFycyByZXByZXNlbnQgdGhlIHRvdGFsIG51bWJlciBvZiBtaWxpdGFyeSBhaXJjcmFmdCBpbiB0aGUgd29ybGQgaW4gZWFjaCB5ZWFyLiBUaGUgYmx1ZSBsaW5lIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGFpcmNyYWZ0IG93bmVkIGJ5IGVhY2ggbmF0aW9uYWwgbWlsaXRhcnkgaW4gZWFjaCB5ZWFyLiBMZWZ0IHktYXhpcyB2YWx1ZXMgKGJsYWNrKSBjb3JyZXNwb25kIHRvIHRvdGFsIG1pbGl0YXJ5IGFpcmNyYWZ0IHZhbHVlcyBhbmQgcmlnaHQgeS1heGlzIHZhbHVlcyAoYmx1ZSkgY29ycmVzcG9uZCB0byBuYXRpb25hbCBhdmVyYWdlIHZhbHVlcy4iLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQpyZG1jX2xvbmcgJT4lCiAgdGlkeXI6OnNlcGFyYXRlKGNvbCA9IHRlaywgaW50byA9IGMoInBhcmVudCIsICJjaGlsZCIpLCBzZXAgPSAiXyIsIHJlbW92ZSA9IFRSVUUpICU+JQogIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgeWVhciwgcGFyZW50LCB1bml0X2NvdW50KSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoY291bnRyeSwgeWVhciwgcGFyZW50KSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKGVxdWlwbWVudF9jb3VudCA9IHN1bSh1bml0X2NvdW50KSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShlcXVpcG1lbnRfY291bnQpKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoeWVhciwgcGFyZW50KSAlPiUKICBkcGx5cjo6bXV0YXRlKGFubnVhbF9hdmcgPSByb3VuZChtZWFuKGVxdWlwbWVudF9jb3VudCksIDApLAogICAgICAgICAgICAgICAgYW5udWFsX3RvdGFsID0gc3VtKGVxdWlwbWVudF9jb3VudCkpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkgJT4lCiAgZHBseXI6OnNlbGVjdCh5ZWFyLCBwYXJlbnQsIGFubnVhbF9hdmcsIGFubnVhbF90b3RhbCkgJT4lCiAgZHBseXI6OmRpc3RpbmN0KCkgJT4lCiAgZHBseXI6OmZpbHRlcihwYXJlbnQgPT0gImFpcmNyYWZ0IikgJT4lCiAgZ2dwbG90KGFlcyh5ZWFyLCBhbm51YWxfdG90YWwpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSwgZmlsbCA9ICJncmF5IiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IGFubnVhbF9hdmcqMTAwKSwKICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAyKSArCiAgbGFicyh0aXRsZSA9ICJHbG9iYWwgTmF0aW9uYWwgQWlyY3JhZnQgSW52ZW50b3JpZXMgKDE5NzAtMjAxNCkiLAogICAgICAgc3VidGl0bGUgPSAiIiwgeCA9ICJZZWFyIiwgeSA9ICJUb3RhbCB3b3JsZCBjb3VudCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoc2VjLmF4aXMgPSBzZWNfYXhpcyh+IC4gLzEwMCwgbmFtZSA9ICJNZWFuIG5hdGlvbmFsIGNvdW50IikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5NzAsIDIwMTQsIDUpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMudGl0bGUueS5yaWdodCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibHVlIiksCiAgICAgICAgYXhpcy50ZXh0LnkucmlnaHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmx1ZSIpKQpgYGAKCiMjIFRlY2hub2xvZ2ljYWwgVHJlbmRzIEFjcm9zcyBTdGF0ZXMKVGhlcmUgaXMgYSBnZW5lcmFsIHJlY29nbml0aW9uIHRoYXQgbWlsaXRhcnkgY2FwYWJpbGl0aWVzIGRpZmZlciBpbiB0aGVpciBwdXJwb3NlIFtAbGluZHNheV9wb2xpdGljc21hbnlvdGhlcl8yMDIwXS4gU29tZSBjYXBhYmlsaXRpZXMgYXJlIHNhbGllbnQgb25seSBmb3Igc3RhdGVzIHRyeWluZyB0byBwcm9qZWN0IHBvd2VyIHdoaWxlIG90aGVycyBhcmUgcmVsZXZhbnQgZm9yIGV2ZXJ5IHN0YXRlJ3MgdGVycml0b3JpYWwgZGVmZW5zZS4gV2hhdCBjYXBhYmlsaXRpZXMgZG8gc3RhdGVzIHByb2R1Y2UgbW9yZSBvciBmZXdlciBvZiwgYWxsIGVsc2UgYmVpbmcgZXF1YWw/CgkJCkZpZ3VyZSBccmVme2ZpZzpsb2xsaXBvcC11c30gc2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiBvZiBVUyBtaWxpdGFyeSBjYXBhYmlsaXRpZXMgcmVsYXRpdmUgdG8gdGhlIHdvcmxkIGF2ZXJhZ2UgYXQgb25lIGRlY2FkZSBpbnRlcnZhbHMuIE5vdCBzdXJwcmlzaW5nbHksIFVTIGNhcGFiaWxpdGllcyBnZW5lcmFsbHkgZHdhcmYgdGhvc2Ugb2YgdGhlIHJlc3Qgb2YgdGhlIGludGVybmF0aW9uYWwgc3lzdGVtLiBIb3dldmVyLCBzb21lIGV4Y2VwdGlvbnMgZXhpc3QuIEZvciBtdWNoIG9mIHRoZSBwYXN0IGhhbGYgY2VudHVyeSwgdGhlIFVuaXRlZCBTdGF0ZXMgaGFzIGhhZCBmZXdlciBhbnRpLXRhbmsvYW50aS1pbmZyYXN0cnVjdHVyZSBjYXBhYmlsaXRpZXMgYXMgd2VsbCBhcyBmZXdlciBtaW5lIHdhcmZhcmUgY2FwYWJpbGl0aWVzIHRoYW4gdGhlIGF2ZXJhZ2Ugc3RhdGUuCgkJClRoaXMgb2JzZXJ2YXRpb24gaXRzZWxmIGNvdWxkIGJlIGV4cGxhaW5lZCBieSBteXJpYWQgZmFjdG9ycy4gVGhlIGludGVybmF0aW9uYWwgaW50ZXJlc3RzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG1heSBub3QgbmVjZXNzaXRhdGUgc3Vic3RhbnRpYWwgZGV2ZWxvcG1lbnQgb2YgdGhlc2UgY2FwYWJpbGl0aWVzLiBQZXJoYXBzIGdlb2dyYXBoeSBtYWtlcyB0aGVzZSBjYXBhYmlsaXRpZXMgbGVzcyBzYWxpZW50LCBhcyBtaW5lIHdhcmZhcmUgbWF5IGJlIGxlc3Mgc2FsaWVudCB0byBzdGF0ZXMgdGhhdCBwcmltYXJpbHkgZmlnaHQgdGhlaXIgd2FycyBmYXIgZnJvbSBob21lLiBNaWxpdGFyeSBjYXBhYmlsaXRpZXMgaGF2ZSBzdWJzdGl0dXRlcyBhbmQgY29tcGxlbWVudHMsIGFuZCBpdCdzIHBvc3NpYmxlIHRoYXQgYW50aS10YW5rL2FudGktaW5mcmFzdHJ1Y3R1cmUgbmVlZHMgYXJlIGFkZXF1YXRlbHkgYWRkcmVzc2VkIHdpdGggYm9tYmluZyBhaXJjcmFmdCBhbmQgbGFuZCBkZWZlbnNlIG1pc3NpbGVzLiBRdWFudGl0eSBpcyBhbHNvIG5vdCBzeW5vbnltb3VzIHdpdGggcXVhbGl0eSwgc28gaXQgY291bGQgYmUgdGhhdCB0aGUgVVMgaXMgc3RpbGwgbW9yZSB0aGFuIHN1ZmZpY2llbnRseSBjYXBhYmxlIGluIHRoZXNlIGRvbWFpbnMuIFdoYXRldmVyIHRoZSB0aGVvcml6ZWQgZXhwbGFuYXRpb24sIHRoaXMgbmV3IGRhdGEgbm93IGFsbG93cyBzY2hvbGFycyB0byBlbXBpcmljYWxseSBleGFtaW5lIGEgY2xhaW0gYWJvdXQgd2h5IHN0YXRlcyBwb3NzZXNzIHRoZSBkaXN0cmlidXRpb24gb2YgbWlsaXRhcnkgY2FwYWJpbGl0aWVzIHRoYXQgdGhleSBkby4KCQkKYGBge3IgbG9sbGlwb3AtdXMsIGZpZy5jYXAgPSAiQ291bnQgb2YgVVMgbWlsaXRhcnkgY2FwYWJpbGl0aWVzIHJlbGF0aXZlIHRvIG90aGVyIHN0YXRlcyBpbiBkZWNhZGUgaW50ZXJ2YWxzLiBFYWNoIGJhciByZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGNvdW50IG9mIFVTIGNhcGFiaWxpdGllcyByZWxhdGl2ZSB0byB0aGUgd29ybGQgYXZlcmFnZS4gQ29sb3JzIHJlcHJlc2VudCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc3RhbmRhcmQgZGV2aWF0aW9ucy4iLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQpyZG1jX2xvbmcgJT4lCiAgdGlkeXI6OnNlcGFyYXRlKGNvbCA9IHRlaywgaW50byA9IGMoInBhcmVudCIsICJjaGlsZCIpLCBzZXAgPSAiXyIsIHJlbW92ZSA9IFRSVUUpICU+JQogIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgeWVhciwgcGFyZW50LCB1bml0X2NvdW50KSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoY291bnRyeSwgeWVhciwgcGFyZW50KSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKGVxdWlwbWVudF9jb3VudCA9IHN1bSh1bml0X2NvdW50LCBuYS5ybSA9IFRSVUUpKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGRwbHlyOjptdXRhdGUocGFyZW50ID0gYXMuZmFjdG9yKHBhcmVudCkpICU+JQogIGRwbHlyOjpncm91cF9ieSh5ZWFyLCBwYXJlbnQpICU+JQogIGRwbHlyOjptdXRhdGUoZXF1aXBfc2NhbGUgPSByb3VuZChzY2FsZShlcXVpcG1lbnRfY291bnQpLCAxKSkgJT4lCiAgZHBseXI6Om11dGF0ZSh0eXBlID0gZHBseXI6OmlmX2Vsc2UoZXF1aXBfc2NhbGUgPCAwLCAiYmVsb3ciLCAiYWJvdmUiKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1lcXVpcG1lbnRfY291bnQpICU+JQogIGRwbHlyOjptdXRhdGUocGFyZW50ID0gc3RyaW5ncjo6c3RyX3RvX3RpdGxlKHBhcmVudCkpICU+JQogIGRwbHlyOjpmaWx0ZXIoY291bnRyeSA9PSAidXMiLAogICAgICAgICAgICAgICAgc3RyaW5ncjo6c3RyX2RldGVjdCh5ZWFyLCAiNCQiKSwKICAgICAgICAgICAgICAgIHllYXIgIT0gMTk3NCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihmYWN0b3IocGFyZW50KSwgZHBseXI6OmRlc2MocGFyZW50KSksIAogICAgICAgICAgICAgeSA9IGVxdWlwX3NjYWxlLAogICAgICAgICAgICAgbGFiZWwgPSBlcXVpcF9zY2FsZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSBwYXJlbnQsCiAgICAgICAgICAgICAgICAgICB4ZW5kID0gcGFyZW50LAogICAgICAgICAgICAgICAgICAgeSA9IDAsCiAgICAgICAgICAgICAgICAgICB5ZW5kID0gZXF1aXBfc2NhbGUpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sID0gdHlwZSksCiAgICAgICAgICAgICBzdGF0ID0gJ2lkZW50aXR5JywKICAgICAgICAgICAgIHNpemUgPSA2KSArCiAgZ2VvbV90ZXh0KGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgc2l6ZSA9IDIuNSkgKwogIGNvb3JkX2ZsaXAoKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KSArCiAgZmFjZXRfd3JhcCh+IHllYXIsIHNjYWxlcyA9ICJmcmVlX3giKSArCiAgbGFicyh0aXRsZSA9ICJVUyBNaWxpdGFyeSBDYXBhYmlsaXRpZXMgQ29tcGFyZWQgdG8gR2xvYmFsIEF2ZXJhZ2UiLAogICAgICAgY2FwdGlvbiA9ICJOb3RlOiBCYXJzIHJlcHJlc2VudCBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gdGhlIGFubnVhbCBtZWFuIGZvciBlYWNoIGNhdGVnb3J5LiIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIlN0YW5kYXJkIERldmlhdGlvbiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMiksCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpXaGF0IHN0YXRlcyBoYXZlIG1pbGl0YXJ5IHBvcnRmb2xpb3MgdGhhdCBtb3N0IGNsb3NlbHkgbWlycm9yIHRob3NlIG9mIG90aGVycz8gQXMgYSBzaW1wbGlmaWVkIHByb29mIG9mIGNvbmNlcHQsIEZpZ3VyZSBccmVme2ZpZzpjb3VudHJ5LWNsdXN0ZXJzfSBzaG93cyB0aGUgcmVzdWx0cyBvZiBhIGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIGFuYWx5c2lzIGZvciBhbGwgc3RhdGVzIGluIDIwMDQgdXNpbmcgYmluYXJ5IHZhbHVlcyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoYXQgc3RhdGUgcG9zc2Vzc2VkIGVhY2ggb2YgdGhlIDc0IG1pbGl0YXJ5IHRlY2hub2xvZ2llcyBwcmVzZW50IGluIHRoZSBkYXRhLl5bSSBleGNsdWRlIHN0YXRlcyB3aXRoIGEgcG9wdWxhdGlvbiBiZWxvdyA3NTAsMDAwIGFzIGRvbmUgYnkgQGV5cmVfc3RhdHVzbm9ybXNwcm9saWZlcmF0aW9uXzE5OTYgYW5kIEBzZWNoc2VyX2FybXl5b3VoYXZlXzIwMTAuXSBBIGZvcm0gb2YgY29tbXVuaXR5IGRldGVjdGlvbiwgaGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgaXMgYWdnbG9tZXJhdGl2ZSwgbWVhbmluZyBpdCBpZGVudGlmaWVzIHRoZSBuZWFyZXN0IG5laWdoYm9yIGZvciBlYWNoIG9ic2VydmF0aW9uLCBwYWlyaW5nIHRoZW0gdG9nZXRoZXIgaW50byBjbHVzdGVycyB0aGF0IG1pbmltaXplIHdpdGhpbi1jbHVzdGVyIGRpc3NpbWlsYXJpdHkgcmVsYXRpdmUgdG8gYWxsIG90aGVyIHBvc3NpYmxlIHBhaXJpbmdzIHVudGlsIHRoZSByb290IG5vZGUgY29ubmVjdHMgYWxsIGNsdXN0ZXJzIHRvIG9uZSBhbm90aGVyLl5bVGhpcyBjbHVzdGVyaW5nIG1ldGhvZCBoYXMgYmVlbiB1c2VkIGZvciBjb21tdW5pdHkgZGV0ZWN0aW9uIG9mIGVjb25vbWljIGluZHVzdHJ5IGNsdXN0ZXJzIFtAa2FsaV9ncm93dGhuZXR3b3Jrc18yMDEzOyBAZGVsZ2Fkb19kZWZpbmluZ2NsdXN0ZXJzcmVsYXRlZF8yMDE2XSwgcHJlZmVyZW50aWFsIHRyYWRlIGFncmVlbWVudCAoUFRBKSBtZW1iZXJzaGlwIFtAaGFmbmVyLWJ1cnRvbl9nbG9iYWxpemF0aW9uc29jaWFscG93ZXJfMjAwOSwgMzEtMzRdLCBtaWxpdGFyeSBhbGxpYW5jZXMgW0BydXNzZXR0X2VtcGlyaWNhbHR5cG9sb2d5aW50ZXJuYXRpb25hbF8xOTcxOyBAbGlfcmVsYXRpb25hbHNpbWlsYXJpdHlpbnRyb2R1Y3Rpb25fMjAxMF0sIGFuZCBzb2NpYWwgbWVkaWEgYmVoYXZpb3IgZHVyaW5nIHByb3Rlc3QgbW92ZW1lbnRzIFtAdmFyb2xfZXZvbHV0aW9ub25saW5ldXNlcl8yMDE0XS5dCgpDYXV0aW9uaW5nIHRoYXQgRmlndXJlIFxyZWZ7ZmlnOmNvdW50cnktY2x1c3RlcnN9IGlzIGEgc2ltcGxpZmllZCBleGFtcGxlIChhIHNpbmdsZSB5ZWFyIHNuYXBzaG90IGFuZCB1c2luZyBiaW5hcnkgcmF0aGVyIHRoYW4gY291bnQgdmFsdWVzKSwgdGhlIHJlc3VsdHMgbm9uZXRoZWxlc3MgZGVtb25zdHJhdGUgdGhlIHV0aWxpdHkgb2YgZGlzYWdncmVnYXRpbmcgbWlsaXRhcnkgY2FwYWJpbGl0aWVzIGZvciBpZGVudGlmeWluZyBzaW1pbGFyaXR5IGluIG5hdGlvbmFsIGRlZmVuc2UgcG9ydGZvbGlvcyBpbiB3YXlzIG1pbGl0YXJ5IHNpemUgY2Fubm90LiBUaGlzIGdlbmVyYXRlcyB0ZXN0YWJsZSBoeXBvdGhlc2VzIGNvbmNlcm5pbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1pbGl0YXJ5IGNvbXBvc2l0aW9uIGFuZCBmYWN0b3JzIGxpa2UgdGVjaG5vbG9naWNhbCBjYXBhY2l0eSwgZ2VvZ3JhcGh5LCB0aHJlYXQgZW52aXJvbm1lbnQsIGFuZCBjb25mbGljdCBoaXN0b3J5LiBGb3IgZXhhbXBsZSwgdGhlIHN0YXRlcyB3aXRoIHRoZSBtb3N0IHNpbWlsYXIgY2FwYWJpbGl0aWVzIHRvIHRoZSBVbml0ZWQgU3RhdGVzICh0aGUgdmVyeSBib3R0b20gYnJhbmNoKSBhcHBlYXIgdG8gYmUgaW5kdXN0cmlhbGx5IGFkdmFuY2VkIHN0YXRlcyB3aXRoIGdsb2JhbCBhbWJpdGlvbnMgLS0gQ2hpbmEgYW5kIFJ1c3NpYSwgZm9sbG93ZWQgYnkgdGhlIEl0YWx5LCBGcmFuY2UsIFNwYWluLCBCcmF6aWwsIGFuZCB0aGUgVUsuIEJ5IGNvbXBhcmlzb24sIHRoZSBjbHVzdGVyIG9mIHN0YXRlcyBmcm9tIENoYWQgYW5kIEJ1cmtpbmEgRmFzbyB0byBBZmdoYW5pc3RhbiBhbmQgTW9uZ29saWEgKHRoZSBoaWdoZXN0IGNsdXN0ZXIpIGlzIHRoZSBtb3N0IHVuaXF1ZSwgYXMgc3BsaXR0aW5nIHN0YXRlcyBhdCBlYWNoIGxldmVsIG9mIHRoZSB0cmVlIGZpcnN0IGludm9sdmVzIGRpc3Rpbmd1aXNoaW5nIGEgZ3JvdXAgb2Ygc3RhdGVzIGZyb20gdGhhdCBjbHVzdGVyLiAxMCBvZiB0aGUgMTIgY291bnRyaWVzIGluIHRoaXMgY2x1c3RlciBoYXZlIGEgaGlzdG9yeSBvZiBjaXZpbCBjb25mbGljdCBpbiB0aGUgaGFsZiBkZWNhZGUgbGVhZGluZyB1cCB0byAyMDA0Ll5bRGF0YSBvbiBjaXZpbCB3YXIgb2NjdXJyZW5jZSBjb21lcyBmcm9tIHRoZSBVQ0RQL1BSSU8gQXJtZWQgQ29uZmxpY3QgRGF0YXNldCB2ZXJzaW9uIDIwLjEgW0BnbGVkaXRzY2hfYXJtZWRjb25mbGljdDE5NDYyMDAxXzIwMDJdLl0gUHJpb3IgcmVzZWFyY2ggaGFzIGZvdW5kIGFuIGVtcGlyaWNhbCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgc3RhdGUncyBoaXN0b3J5IG9mIGRvbWVzdGljIGluc3VyZ2VuY2llcyBhbmQgY2l2aWwgY29uZmxpY3QgYW5kIHRoZSBkZWdyZWUgb2YgbWlsaXRhcnkgbWVjaGFuaXphdGlvbiBbQGx5YWxsX3JhZ2VtYWNoaW5lc2V4cGxhaW5pbmdfMjAwOTsgQHNlY2hzZXJfYXJteXlvdWhhdmVfMjAxMDsgQGNhdmVybGV5X21pbGl0YXJ5dGVjaG5vbG9neWR1cmF0aW9uXzIwMTddLiBFeHRlbnNpb25zIG9mIHRoaXMgcmVzZWFyY2ggY2FuIHVzZSByRE1DIHRvIGlkZW50aWZ5IG90aGVyIHF1YWxpdGllcyBvZiBhIHN0YXRlJ3MgZGlzdHJpYnV0aW9uIG9mIG1pbGl0YXJ5IGNhcGFiaWxpdGllcyB0aGF0IG1pZ2h0IGJlIGFzc29jaWF0ZWQgd2l0aCBjaXZpbCBjb25mbGljdCBwYXJ0aWNpcGF0aW9uIGFuZCBvdXRjb21lLgoKYGBge3IgY291bnRyeS1jbHVzdGVycywgZmlnLmNhcCA9ICJIaWVyYXJjaGljYWwgY2x1c3RlciBzaG93aW5nIHNpbWlsYXJpdHkgb2YgbWlsaXRhcnkgdGVjaG5vbG9naWVzIHBvcnRmb2xpb3MuIiwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9MTB9CmNsdXN0ZXJfZHVtbXkgPC0gcmRtY19sb25nICU+JQogIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgeWVhciwgdGVrLCB1bml0X2NvdW50KSAlPiUKICBkcGx5cjo6bXV0YXRlKHVuaXRfY291bnQgPSBkcGx5cjo6aWZfZWxzZShpcy5uYSh1bml0X2NvdW50KSwgMSwgdW5pdF9jb3VudCkpICU+JQogIGRwbHlyOjpncm91cF9ieShjb3VudHJ5LCB5ZWFyLCB0ZWspICU+JQogIGRwbHlyOjpzdW1tYXJpemUodW5pdF9jb3VudCA9IHN1bSh1bml0X2NvdW50KSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6bXV0YXRlKHVuaXRfY291bnQgPSBkcGx5cjo6aWZfZWxzZSh1bml0X2NvdW50ID4gMCwgMSwgMCkpICU+JQogIGRwbHlyOjpncm91cF9ieShjb3VudHJ5LCB5ZWFyKSAlPiUKICB0aWR5cjo6c3ByZWFkKGtleSA9IHRlaywgdmFsdWUgPSB1bml0X2NvdW50KSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGRwbHlyOjpmaWx0ZXIoeWVhciA9PSAyMDA0KSAlPiUKICBkcGx5cjo6c2VsZWN0KC15ZWFyKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShjb3VudHJ5KSkgJT4lCiAgZHBseXI6Om11dGF0ZShjb3VudHJ5ID0gc3RyaW5ncjo6c3RyX3RvX3RpdGxlKGNvdW50cnkpKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiY291bnRyeSIpICU+JQogIGphbml0b3I6OnJlbW92ZV9lbXB0eSh3aGljaCA9ICJjb2xzIikKCnNldC5zZWVkKDIwMjEpCgojIFNob3cgY2x1c3RlcnMKZGVuZG8gPC0gZmFjdG9leHRyYTo6ZWNsdXN0KGNsdXN0ZXJfZHVtbXksICJoY2x1c3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNfbWV0cmljID0gImJpbmFyeSIpCgpmYWN0b2V4dHJhOjpmdml6X2RlbmQoZGVuZG8sCiAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJlY3RhbmdsZSIsCiAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gImFhYXMiLAogICAgICAgICAgICAgICAgICAgICAgaG9yaXogPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzX3RyYWNrX2hlaWdodCA9IDAuOCwKICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiQ291bnRyeSBUZWNoIFBvcnRmb2xpbyBTaW1pbGFyaXR5IERlbmRyb2dyYW0gKDIwMDQpIiwKICAgICAgICAgICAgICAgICAgICAgIGNleCA9IDAuNCwKICAgICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpgYGAKCiMgQ29uY2x1c2lvbgpIZXRlcm9nZW5laXR5IGluIGhvdyBzdGF0ZXMgYXJtIHRoZW1zZWx2ZXMgZXhpc3RzIGFuZCBpcyBzaWduaWZpY2FudCBib3RoIGluIHRlcm1zIG9mIHN1YnN0YW5jZSBhbmQgY29uc2VxdWVuY2UuIElkZW50aWZ5aW5nIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgaGV0ZXJvZ2VuZWl0eSBpcyBhIG5lY2Vzc2FyeSBwcmVjb25kaXRpb24gZm9yIGV4cGxhaW5pbmcgYm90aCBpdHMgY2F1c2VzIGFuZCBjb25zZXF1ZW5jZXMgaW4gaW50ZXJuYXRpb25hbCBhZmZhaXJzLiBUbyBkYXRlLCBleHBsYW5hdGlvbnMgb2YgdGhlIGNhdXNlcyBvciBlZmZlY3RzIG9mIHZhcmlhdGlvbiBpbiB0aGUgY29tcG9zaXRpb24gb2YgYSBzdGF0ZSdzIG1pbGl0YXJ5IGFzc2V0cyBoYXMgYmVlbiBlbXBpcmljYWxseSBsaW1pdGVkIGJlY2F1c2UgdGhhdCBkYXRhIGhhcyBub3QgZXhpc3RlZCBpbiBhIHdheSBjb25kdWNpdmUgdG8gc3lzdGVtaWMgYW5hbHlzaXMuIFRoaXMgaXMgbm90IGp1c3QgdHJ1ZSBmb3IgcXVhbnRpdGF0aXZlIHNjaG9sYXJzIGludGVyZXN0ZWQgaW4gbGFyZ2UgY3Jvc3MtbmF0aW9uYWwgcmVncmVzc2lvbnM7IHNjaG9sYXJzIHN0dWR5aW5nIGluZGl2aWR1YWwgY291bnRyaWVzLCByZWdpb25zLCBvciBzcGVjaWZpYyB0aW1lIHBlcmlvZHMgaGF2ZSBiZWVuIGxpbWl0ZWQgaW4gdGhlaXIgYWJpbGl0eSB0byBwcm92aWRlIGV2ZW4gZGVzY3JpcHRpdmUgYWNjb3VudHMgYWJvdXQgdGhlIGJhbGFuY2Ugb2YgbWlsaXRhcnkgcG93ZXIgdXNpbmcgYW55IG9ic2VydmF0aW9ucyBtb3JlIGRldGFpbGVkIHRoYW4gbmF0aW9uYWwgbWlsaXRhcnkgc3BlbmRpbmcsIG1pbGl0YXJ5IHBlcnNvbm5lbCBjb3VudHMsIG9yIG91dGNvbWVzIG9mIGludGVyZXN0cyBsaWtlIGFjdHVhbGl6ZWQgY29uZmxpY3RzLiBUaGUgaG9wZSBpcyB0aGF0IHRoZSBicm9hZGVyIHNjaG9sYXJseSBjb21tdW5pdHkgY2FuIHVzZSB0aGUgZGF0YSBjcmVhdGVkIGhlcmUgdG8gYW5zd2VycyBvdGhlciBxdWVzdGlvbnMgb2YgaW50ZXJlc3QuIFdoaWxlIG11Y2ggaW5rIGhhcyBiZWVuIHNwaWxsZWQgZGViYXRpbmcgXHRleHRpdHt3aGV0aGVyfSBtaWxpdGFyeSB0ZWNobm9sb2d5IG1hdHRlcnMgW0B0dWNobWFuX2d1bnNhdWd1c3RfMTk2MjsgQHJvc2VuX3dpbm5pbmduZXh0d2FyXzE5OTE7IEBiZXR0c19zaG91bGRzdHJhdGVnaWNzdHVkaWVzXzE5OTddLCB0aGUgZGlzY3Vzc2lvbiBzaG91bGQgcHJvZHVjdGl2ZWx5IHNoaWZ0IHRvIFx0ZXh0aXR7d2hhdH0gbWlsaXRhcnkgdGVjaG5vbG9naWVzIG1hdHRlciBhbmQgXHRleHRpdHtob3d9LiBJbiB0cmFuc3BhcmVudGx5IHByZXNlbnRpbmcgdGhlIHByb2Nlc3MgYnkgd2hpY2ggdGhpcyBkYXRhIHdhcyBjcmVhdGVkLCB0aGF0IHNob3VsZCBiZSBlYXNpZXIuCgpcbmV3cGFnZQoKIyBSZWZlcmVuY2VzCg==